This question already has answers here:
Java 8 collector for Guava immutable collections?

(5个答案)


4年前关闭。





我发现自己想要一个Collectors.toMap的变体,该变体返回一个ImmutableMap,这样我可以做:

ImmutableMap result = list.stream().collect(MyCollectors.toImmutableMap(
    tuple -> tuple._1(), tuple -> tuple._2());


(在此特定示例中,tuple是Scala Tuple2

just learned已经在Guava 21中支持Java-8了(是的),但是听起来很不错,但距离现在还有6个月了。有谁知道今天可以实现此功能的任何现有库(等)?

ImmutableMap不是严格要求的,但似乎是我所要求的最佳选择:按键查找,并保留原始迭代顺序。不变性也总是首选。

请注意,FluentIterable.toMap(Function)是不够的,因为我既需要键映射功能,也需要值映射功能。

最佳答案

您无需为此收集器编写匿名类。您可以改用Collector.of

public static <T, K, V> Collector<T, ?, ImmutableMap<K,V>> toImmutableMap(
            Function<? super T, ? extends K> keyMapper,
            Function<? super T, ? extends V> valueMapper) {
    return Collector.of(
               ImmutableMap.Builder<K, V>::new,
               (b, e) -> b.put(keyMapper.apply(e), valueMapper.apply(e)),
               (b1, b2) -> b1.putAll(b2.build()),
               ImmutableMap.Builder::build);
}


或者,如果您不介意先将结果收集到可变映射中,然后再将数据复制到不可变映射中,则可以将内置的toMap收集器与collectingAndThen结合使用:

ImmutableMap<String, String> result =
     list.stream()
         .collect(collectingAndThen(
             toMap(
                 tuple -> tuple._1(),
                 tuple -> tuple._2()),
             ImmutableMap::copyOf));

10-07 18:56