gpt4 book ai didi

java - 创建一个 ImmutableMap> 流收集器

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:27 24 4
gpt4 key购买 nike

为了提高效率,我经常遇到需要一张多图的情况。我更喜欢使用 Guava 的 ImmutableMapImmutableMultimap来完成这个。

我借用并创造了几个Collector Guava 的实现,因此我可以利用 Java 8 流。例如,这是一个 ImmutableListMultimap 的收集器.

public static <T, K, V> Collector<T, ?, ImmutableListMultimap<K, V>> toImmutableListMultimap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper) {

Supplier<ImmutableListMultimap.Builder<K, V>> supplier = ImmutableListMultimap.Builder::new;

BiConsumer<ImmutableListMultimap.Builder<K, V>, T> accumulator = (b, t) -> b
.put(keyMapper.apply(t), valueMapper.apply(t));

BinaryOperator<ImmutableListMultimap.Builder<K, V>> combiner = (l, r) -> l.putAll(r.build());

Function<ImmutableListMultimap.Builder<K, V>, ImmutableListMultimap<K, V>> finisher = ImmutableListMultimap.Builder::build;

return Collector.of(supplier, accumulator, combiner, finisher);
}

我想为我当前的问题创建一个非常相似的收集器。我希望我的 Collection 家创建一个 ImmutableMap<P,ImmutableMultimap<C,V>> , 其中P是主 map 的父键,C是子图的子键。两个 Function将提供 lambdas 来为每个 T 映射这些键元素。

说起来容易做起来难。到目前为止,我所做的所有工作都是创建方法 stub 。

public static <T, P, C, V> Collector<T, ?, ImmutableMap<P, ImmutableMultimap<C,V>>> toPartitionedImmutableMultimap(
Function<? super T, ? extends P> parentKeyMapper,
Function<? super T, ? extends C> childKeyMapper,
Function<? super T, ? extends V> valueMapper) {

}

因为 Guava 不可变集合构建器不允许查找,我发现自己使用可变 HashMap 来查找以前捕获的值,所以我只会在 P 键不存在时创建一个新的 ImmutableMultimap。但是这个过程很快就变得头晕目眩。

有没有一种有效的方法来做到这一点?

最佳答案

您尝试过直接的方法吗?

collectingAndThen(
groupingBy(
parentKeyMapper,
toImmutableListMultimap(childKeyMapper, valueMapper)
),
ImmutableMap::copyOf
);

更新:上面的代码在 JDK 上运行良好,但 Eclipse 编译器会报错。这是 Eclipse 将接受的版本:

public static <T, P, C, V> Collector<T, ?, ImmutableMap<P, ImmutableMultimap<C, V>>> toPartitionedImmutableMultimap(
Function<? super T, ? extends P> parentKeyMapper,
Function<? super T, ? extends C> childKeyMapper,
Function<? super T, ? extends V> valueMapper) {

return Collectors.collectingAndThen(
Collectors.groupingBy(
parentKeyMapper,
SO29417692.<T,C,V>toImmutableListMultimap(childKeyMapper, valueMapper)
),
ImmutableMap::<P,ImmutableMultimap<C,V>>copyOf
);
}

关于java - 创建一个 ImmutableMap<P,ImmutableMultimap<C,V>> 流收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29417692/

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