【发布时间】:2020-05-05 20:11:00
【问题描述】:
我有如下所示的交易对象列表:
List<Transaction> transactions = Arrays.asList(
new Transaction(brian, 2011, 300, "X", "M1"),
new Transaction(raoul, 2012, 1000, "T", "M1"),
new Transaction(raoul, 2011, 400, "S", "M2"),
new Transaction(mario, 2012, 710, "X", "M1"),
new Transaction(mario, 2012, 700, "X", "M2"),
new Transaction(alan, 2012, 950, "T", "M1")
);
事务类:
class Transaction {
private final Trader trader;
private final int year;
private final int value;
private String type;
private String method;
}
现在我需要根据每个组的事务类型找到平均值,最后将平均值转储到 Result 对象中,其中包含一些关于正在计算其平均值的组的额外数据等。
在计算之前。对列表执行以下操作:
- 按年份分组交易
- 然后按方法分组
最终生成的对象应该有平均值、年份和方法的值。
结果类:
class Result {
private Double avg;
private int year;
private String method;
}
代码:
Map<Integer, Map<String, Result>> res = transactions.stream().collect(
groupingBy(Transaction::getYear,
groupingBy(Transaction::getMethod),
collectingAndThen( averagingDouble( t -> "X".equals(t.getType()) ? 1: 0 ),
v -> new Result(v, GROUP_METHOD? , GROUP_YEAR?))
)
);
但是 GROUP_METHOD 和 GROUP_YEAR 值在此处无法访问,因为 averagingDouble() 会生成一个双精度值,并且此映射中会丢失所有其他信息。
有什么方法可以获取这些字段或将结果正确映射到对象中?
【问题讨论】:
标签: java lambda java-8 java-stream collectors