我在流分组方面遇到问题。
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 公斤。
我可以按种类分组并了解总重量吗?
最佳答案
如果我理解正确的话:
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)))));
但是你不能真正让它们同时起作用。
关于java - 按一个字段进行流式分组,然后合并所有其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45105784/