arraylist如何使用JAVA流从对象列表中查找平均值
我有两门课,账单和费用如下
class Bill {
private String id;
private List<Charge> charges;
// Getters Setters Constructors etc..
}
class Charge{
private String typeId;
private double a;
private double b;
// Getters Setters Constructors etc..
}
List<Bill> bills = new ArrayList<>();
Bill b1 = new Bill();
b1.setId("1");
List<Charge> charges = new ArrayList<>();
charges.add(new Charge("type-1",20,30));
charges.add(new Charge("type-2",30,30));
b1.setCharges(charges);
Bill b2 = new Bill();
b2.setId("2");
List<Charge> charges2 = new ArrayList<>();
charges2.add(new Charge("type-1",30,40));
charges2.add(new Charge("type-2",40,40));
b2.setCharges(charges2);
现在我有了一个方法, 此方法应基于typeId平均费用,并且每个typeId只返回一笔费用
public Bill average(List<Bill> bills){
...
}
我希望这个方法能返回如下的账单
Bill{
id:null,
charges:[
{
typeId:"type-1",
a:25,
b:35
},
{
typeId:"type-2",
a:35,
b:35
}
]
}
这可以通过for或forEach循环实现,但我希望解决这个Streams api
# 1 楼答案
这应该行得通,不过看起来不太漂亮:
测试片段:
提供以下输出:
# 2 楼答案
或者
# 3 楼答案
# 4 楼答案
一个非常简单的解决方案。当然,操作的数量可以减少到一半,但这使理解变得更简单
flatMap
提取费用并将其收集到一个列表中,然后filter
按类型过滤李>创建一个新的账单对象并返回相同的账单对象