gpt4 book ai didi

Java 8 : Collector groupby with list nested class

转载 作者:行者123 更新时间:2023-12-01 16:49:27 25 4
gpt4 key购买 nike

我正在尝试通过 Java 8 获取以下 map

Class One {
String one;
List <Two> two;
}

Class Two {
BigDecimal bd;
}

如何收集包含按 One.one 分组的 map ,即 map 的第一个参数。对于Two.bd的map sum的第二个参数。

最佳答案

你可以使用这个:

List<One> list = ...;

Map<String, BigDecimal> result1 = list.stream()
.collect(Collectors.groupingBy(One::getOne, // key is One.one
Collectors.mapping(one -> one.getTwo().stream() // get stream of One.two
.map(Two::getBd) // map to Bd
.reduce(BigDecimal.ZERO, BigDecimal::add), // reduce to sum
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add) // sum sums
)
));

这将对 Two 的所有 bd 求和,然后对具有相同 one 的 One 求和.

<小时/>

尽管如果 Java8 有一个 flatMapping 收集器,事情会更简单,但 Java9 中已经添加了一个。 :

public static <T, U, A, R>
Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper,
Collector<? super U, A, R> downstream) {
BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator();
return Collector.of(downstream.supplier(),
(r, t) -> mapper.apply(t).sequential().forEach(u -> downstreamAccumulator.accept(r, u)),
downstream.combiner(),
downstream.finisher(),
downstream.characteristics().stream().toArray(Collector.Characteristics[]::new));
}

这会使得:

Map<String, BigDecimal> result1 = list.stream()
.collect(Collectors.groupingBy(One::getOne,
flatMapping(one -> one.getTwo().stream().map(Two::getBd),
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)
)
));

关于Java 8 : Collector groupby with list nested class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43500966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com