This question already has answers here:
Java 8 collector for Guava immutable collections?
(5个答案)
4年前关闭。
我发现自己想要一个
(在此特定示例中,
我just learned已经在Guava 21中支持Java-8了(是的),但是听起来很不错,但距离现在还有6个月了。有谁知道今天可以实现此功能的任何现有库(等)?
请注意,
或者,如果您不介意先将结果收集到可变映射中,然后再将数据复制到不可变映射中,则可以将内置的
(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