如何创建临时中间对象以传递给Stream中的下一个方法

问题描述

我正在继续撰写有关 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()
                    )
                );