我发现自己想要一个Collectors.toMap
返回的变体ImmutableMap
,这样我就能做到:
ImmutableMap result = list.stream().collect(MyCollectors.toImmutableMap( tuple -> tuple._1(), tuple -> tuple._2());
(tuple
在这个特定的例子中是Scala Tuple2
)
我刚刚了解到这样的方法将在Guava 21中使用Java-8支持(耶!)但这听起来好一个月之后.有谁知道今天可能实现的任何现有库(等)?
ImmutableMap
并非严格要求,但似乎是我要求的最佳选择:按键查找,并保留原始迭代顺序.不变性也是首选.
请注意,这FluentIterable.toMap(Function)
还不够,因为我既需要键映射功能,也需要值映射功能.
您不需要为此收集器编写匿名类.你可以Collector.of
改用:
public staticCollector > toImmutableMap( Function super T, ? extends K> keyMapper, Function super T, ? extends V> valueMapper) { return Collector.of( ImmutableMap.Builder ::new, (b, e) -> b.put(keyMapper.apply(e), valueMapper.apply(e)), (b1, b2) -> b1.putAll(b2.build()), ImmutableMap.Builder::build); }
或者,如果您不介意首先将结果收集到可变映射中,然后将数据复制到不可变映射中,则可以使用内置toMap
收集器并结合collectingAndThen
:
ImmutableMapresult = list.stream() .collect(collectingAndThen( toMap( tuple -> tuple._1(), tuple -> tuple._2()), ImmutableMap::copyOf));