我在番石榴中找不到将Collection(或Iterator / Iterable)转换为Map的方法,如下所示(为清楚起见省略了通配符):
public static <T, K, V> Map<K,V> collectionSplitter(Collection<T> source, Function<T,K> kProducer, Function<T,V> vProducer){
Map<K,V> map = Maps.newHashMap();
for(T t : source){
map.put(kProducer.apply(t), vProducer.apply(t));
}
return map;
}
有没有现成的方法呢?我能找到的最接近的是Splitter.keyValueSplitter(),如果T是一个字符串。
我所知道的最接近的是Maps.uniqueIndex
- 这是关键方面,但不是价值方面......是否足够接近?
您可以使用:
Map<K, V> map = Maps.transformValues(Maps.uniqueIndex(source, kProducer),
vProducer);
稍微尴尬,但它会完成工作,我想......
正如Jon Skeet所提到的,Maps.uniqueIndex目前是最接近您所寻找的东西。
在问题跟踪器中还有一些您要查找的请求,如果您对建议的功能感兴趣,可能需要“加注”:
http://code.google.com/p/guava-libraries/issues/detail?id=56
http://code.google.com/p/guava-libraries/issues/detail?id=460
http://code.google.com/p/guava-libraries/issues/detail?id=679
http://code.google.com/p/guava-libraries/issues/detail?id=718
你可以用java8 stream api来做
Map<Object, Object> map = StreamSupport.stream(iterable.spliterator(), false)
.collect(Collectors.toMap(obj -> toKey(obj),
obj -> toValue(obj)));