我尝试了两种不同的 Java 的 Collectors Reducing 函数,结果有两种,还没有弄清楚为什么。
我有一个行李清单,其中行李是这样定义的
class Baggage {
int num;
int weight;
}
Baggage bag1 = new Baggage(1, 10);
Baggage bag2 = new Baggage(1, 23);
我正在尝试映射该列表并生成一个 Map
第一个还原版本:
Map<Integer, Baggage> mergedBag = baggages.stream()
.collect(Collectors.groupingBy(
Baggage::getWeight,
Collectors.reducing(new Baggage(0, 0), b -> b,
(b1, b2) -> {
b1.setNum(b1.getNum() + b2.getNum());
return b1;
}
)
));
当我使用这个合并函数时,我弄乱了集合并导致 Map 中的两个值的总数为 2 而不是 1
{
"23": {
"num": 2,
"weight": 0
},
"10": {
"num": 2,
"weight": 0
}
}
改良还原版:
Map<Integer, Optional<Baggage>> mergedBag2 = baggages.stream()
.collect(Collectors.groupingBy(
Baggage::getWeight,
Collectors.reducing((b1, b2) -> {
b1.setNum(b1.getNum() + b2.getNum());
return b1;
}
)
));
但是如果我使用第二个版本,它就会出现预期的结果
{
"23": {
"num": 1,
"weight": 23
},
"10": {
"num": 1,
"weight": 10
}
}
所以我的问题是两个减少函数之间的区别是什么,为什么第一个减少它会弄乱其他键的 num 值,这是否意味着映射中的所有值都使用相同的累积返回值,我确实挖掘了在实施中,但还没有太多了解。请帮助我!