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

How to create temporary intermediate objects to pass to next method in Stream

我正在继续我的现代 Java 实战一书,在那里我又收到一个问题。

在 Chap.-6 中作者解释了 groupingBy 我可以按交易的 year 属性 对交易列表 (List<Transaction>) 进行分组,如下所示

Map<Integer, List<Transaction>> txns = transactions.
                stream().
                collect(groupingBy(Transaction::getYear));

这个Transactionclass还有一个Trader (name, city)类型的成员变量(请看下面的class)

有了这个,我目前正在获取地图中按年份分组的交易。

我的问题是:如果我想获得按年份分组的交易者名称和价值,我想我必须创建另一个中间体 class,如下所示

Map<Integer, List<TraderWithValue>>  traderNamesWithAmountByYear = transactions.
                    stream().
                    map(ten -> createObjFromTxn(ten))
                    collect(groupingBy(Transaction::getYear));

所以我想检查是否有一种方法可以避免创建仅使用一次的新 class TraderWithValue。喜欢即时创建内联代码之类的东西?

以下是我的交易和交易者 classes.

public class Transaction{
    private final Trader trader;
    private final int year;
    private final int value;
    // constructors, getters and setters
}

public class Trader{
    private final String name;
    private final String city;
    // constructors, getters and setters
}

如果您正在寻找动态性,您可以为此使用 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()
                    )
                );