【发布时间】:2015-02-12 21:48:43
【问题描述】:
我已经思考了一个星期,但我不太确定有什么方法可以做到这一点。我遇到的一个常见任务是为给定类型的值构建一个包含 ImmutableLists 的 ImmutableMap,如ImmutableMap<K,ImmutableList<V>>,我想通过一个收集器来完成它,以便我可以在流上利用它。
我在如下所示的博客上发现了这个很棒的 ImmutableMap 收集器。但是我希望 V 成为一个 ImmutableList,并且我希望传入流映射多个具有相同键的值,该键与具有 ImmutableList 值的所述键配对。我尝试过的每个实现都是次优的,而不是流式的,因为我一直在使用一个普通的 HashMap 保存 ImmutableList.Builder 值,当我完成填充时,我会循环遍历它并将其转换为 ImmutableList 值调用 build() 并将其放入新地图中。有什么想法吗?
public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>>
toImmutableMap(
Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends V> valueMapper) {
Supplier<ImmutableMap.Builder<K, V>> supplier =
ImmutableMap.Builder::new;
BiConsumer<ImmutableMap.Builder<K, V>, T> accumulator =
(b, t) -> b.put(keyMapper.apply(t), valueMapper.apply(t));
BinaryOperator<ImmutableMap.Builder<K, V>> combiner =
(l, r) -> l.putAll(r.build());
Function<ImmutableMap.Builder<K, V>, ImmutableMap<K, V>> finisher =
ImmutableMap.Builder::build;
return Collector.of(supplier, accumulator, combiner, finisher);
}
我希望实现具有...的标题
public static <T, K, V> Collector<T, ?, ImmutableMap<K, ImmutableList<V>>>
好的,感谢 fge 的帮助,我成功了!请参阅下面的答案。
【问题讨论】:
-
等等,你用的是Guava,那你为什么不用
Multimaps呢?它们也有不可变的版本 -
呵呵,忘了这个家伙......以及它的不可变版本。让我玩这个,看看我能不能让它成为一个收藏家......
标签: java stream guava immutability collectors