如何创建临时中间对象以传递给 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));
这个Transaction
class还有一个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()
)
);
我正在继续我的现代 Java 实战一书,在那里我又收到一个问题。
在 Chap.-6 中作者解释了 groupingBy
我可以按交易的 year
属性 对交易列表 (List<Transaction>
) 进行分组,如下所示
Map<Integer, List<Transaction>> txns = transactions.
stream().
collect(groupingBy(Transaction::getYear));
这个Transaction
class还有一个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()
)
);