我在分组流时遇到麻烦。
List<FAR> listFar = farList.stream().filter(f -> !f.getStatus().equals(ENUM.STATUS.DELETED))
.collect(Collectors.toList());
List<HAUL> haulList = listFar.stream().map(f -> f.getHaul()).flatMap(f -> f.stream())
.collect(Collectors.toList());
它按种类分组,一切都很好,但是HAUL还有另一个属性。
Map<Specie, List<HAUL>> collect = haulList.stream().collect(Collectors.groupingBy(HAUL::getSpecie));
属性:
haul.getFishCount();
(整数)haul.getFishWeight();
(BigDecimal)是否可以按
HAUL::getSpecie
(按Specie)分组,而且还可以将这两个额外的字段“合并”在一起,所以我总计了?例如:我有3个HAUL元素,其中鱼类A的重量为50/30/10 kg。
我可以按种类分组并具有总重量吗?
最佳答案
如果我正确理解:
haulsList
.stream()
.collect(Collectors.groupingBy(HAUL::getSpecie,
Collectors.collectingAndThen(Collectors.toList(),
list -> {
int left = list.stream().mapToInt(HAUL::getFishCount).sum();
BigDecimal right = list.stream().map(HAUL::getFishWeight).reduce(BigDecimal.ZERO, (x, y) -> x.add(y));
return new AbstractMap.SimpleEntry<>(left, right);
})));
有一种形式可以做:
.stream()
.collect(Collectors.groupingBy(HAUL::getSpecie,
Collectors.summingInt(HAUL::getFishCount)));
要么
.stream()
.collect(Collectors.groupingBy(HAUL::getSpecie,
Collectors.mapping(HAUL::getFishWeight, Collectors.reducing((x, y) -> x.add(y)))));
但是您不能真正使它们同时行动。