gpt4 book ai didi

Java 8 Streams : Make Collectors. groupingBy 返回 Map> 而不是 Map>>

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:46 24 4
gpt4 key购买 nike

我有一个 List<SomeBean> . SomeBean其中包含一个返回 K 的方法这可能在列表中重复,另一种方法返回 List<V> .因为我如何使用 SomeBean , 它几乎类似于带有键 K 的条目一个值 List<V> .

我想把它变成一个 Map<K, List<V>> , 其中List<V>是具有相同键 K 的列表的串联.这是我所做的:

private static Map<K, List<V>> transformToMapOfListInTwoSteps(List<SomeBean> paginationResult) {
Map<K, List<List<V>>> mapOfListOfList = paginationResult.stream()
.collect(Collectors.groupingBy(SomeBean::getK, Collectors.mapping(SomeBean::getV, Collectors.toList())));

return mapOfListOfList.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().stream().flatMap(Collection::stream).collect(Collectors.toList())));
}

然而,目前这是分两步完成的。如何在不使用中间一次性用品的情况下执行相同的操作 Map<K, List<List<V>>>

最佳答案

我认为你把事情复杂化了一点。我只会使用 Collectors.toMap 的重载它接受合并函数以在发现键冲突时合并值:

private static <K, V> Map<K, List<V>> transformToMapOfListInOneStep(
List<SomeBean> paginationResult) {

return paginationResult.stream()
.collect(Collectors.toMap(
SomeBean::getK,
someBean -> new ArrayList<>(someBean.getV()),
(v1, v2) -> { v1.addAll(v2); return v1; }));
}

注意:我正在值映射器函数中创建一个新的 ArrayList,因为我不想修改作为 SomeBean 属性的原始列表。

另一种方法是使用 Collectors.groupingBy 以及一个平面映射值的下游收集器,但这在 Java 8 中没有实现(尽管它在 Java 9 中可用,请参阅Collectors.flatMapping ).

在 Java 8 中,这可能实现为:

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> acc = downstream.accumulator();
return Collector.of(downstream.supplier(),
(a, t) -> {
try (Stream<? extends U> s = mapper.apply(t)) {
if (s != null) s.forEachOrdered(u -> acc.accept(a, u));
}
},
downstream.combiner(), downstream.finisher(),
downstream.characteristics().toArray(new Collector.Characteristics[0]));
}

你可以这样使用它:

return paginationResult.stream()
.collect(Collectors.groupingBy(
SomeBean::getK,
flatMapping(
someBean -> someBean.getV().stream(),
Collectors.toList())));

注意 2:我从 this answer given by user @Holger 中获取了 flatMapping 方法的实现。 .

关于Java 8 Streams : Make Collectors. groupingBy 返回 Map<K, List<V>> 而不是 Map<K, List<List<V>>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44079325/

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