问题描述
我正在继续撰写有关 Modern Java in Action 的书,我又收到了一个查询。
在第-6 章中,作者解释了 Flutter packages upgrade
,我可以通过交易的 groupingBy
属性对交易列表 (List<Transaction>
) 进行分组,如下所示
year
这个 Map<Integer,List<Transaction>> txns = transactions.
stream().
collect(groupingBy(Transaction::getYear));
类也有一个类型为 Transaction
的成员变量(请参阅底部的类)
通过这个,我目前在地图中获取按年份分组的交易。
我的问题是:如果我想获得按年份分组的交易者名称和价值,我想我必须创建另一个如下所示的中间类
Trader (name,city)
所以我想检查是否有一种方法可以避免创建仅使用一次的新类 Map<Integer,List<TraderWithValue>> TraderNamesWithAmountByYear = transactions.
stream().
map(ten -> createObjFromTxn(ten))
collect(groupingBy(Transaction::getYear));
。喜欢动态创建内联代码之类的东西吗?
以下是我的交易和交易者课程。
TraderWithValue
解决方法
如果您正在寻找动态性,您可以为此使用 Tuple<T,U>
但是,您将失去命名变量的舒适感。
两个变量的典型 Tuple<T,U>
是 Pair<L,R>
public class Pair<L,R> {
L left;
R right;
}
你可以这样使用
Map<Integer,Tuple<String,Integer>> traderNamesWithAmountByYear =
transactions.stream()
.collect(Collectors.groupingBy(
Transaction::getYear,Collectors.mapping(
tx -> new Tuple<>(tx.getTrader().getName(),tx.getValue()),Collectors.toList()
)
);