Kef*_*iks 4 java lambda java-8 java-stream
我在流分组方面遇到了麻烦。
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());
Run Code Online (Sandbox Code Playgroud)
它按物种分组,这一切都很好,但 HAUL 还有另一个属性。
Map<Specie, List<HAUL>> collect = haulList.stream().collect(Collectors.groupingBy(HAUL::getSpecie));
Run Code Online (Sandbox Code Playgroud)
属性:
haul.getFishCount(); (整数)haul.getFishWeight(); (大十进制)是否可以按HAUL::getSpecie(按 Specie)分组,但也可以将这两个额外的字段“合并”在一起,所以我有总数?
例如:我有 3 个 HAUL 元素,其中鱼种 A 的重量为 50/30/10 公斤。
我可以按物种分组并计算总重量吗?
例如,您可以使用mapping:reduce
class Foo { int count; double weight; String spice; }
List<Foo> fooList = Arrays.asList(
new Foo(1,new BigDecimal(10), "a"),
new Foo(2,new BigDecimal(38), "a"),
new Foo(5,new BigDecimal(2), "b"),
new Foo(4,new BigDecimal(8), "b"));
Map<String,Optional<BigDecimal>> spieceWithTotalWeight = fooList.stream().
collect(
groupingBy(
Foo::getSpice,
mapping(
Foo::getWeight,
Collectors.reducing(BigDecimal::add)
)
)
);
System.out.println(spieceWithTotalWeight); // {a=Optional[48], b=Optional[10]}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
如果我理解正确:
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);
})));
Run Code Online (Sandbox Code Playgroud)
有一个表格要做:
.stream()
.collect(Collectors.groupingBy(HAUL::getSpecie,
Collectors.summingInt(HAUL::getFishCount)));
Run Code Online (Sandbox Code Playgroud)
或者
.stream()
.collect(Collectors.groupingBy(HAUL::getSpecie,
Collectors.mapping(HAUL::getFishWeight, Collectors.reducing((x, y) -> x.add(y)))));
Run Code Online (Sandbox Code Playgroud)
但是你不能真正让这些同时起作用。