番石榴有没有把迭代变成独特类型的地图的方法?

时间:2011-10-13 17:52:59

标签: java guava

我在番石榴中找不到将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是一个字符串。

3 个答案:

答案 0 :(得分:12)

我最接近的是Maps.uniqueIndex - 关键方面,但不是价值方面......是否足够接近?

您可以使用:

Map<K, V> map = Maps.transformValues(Maps.uniqueIndex(source, kProducer),
                                     vProducer);

稍微尴尬,但我认为它会完成工作......

答案 1 :(得分:1)

正如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

答案 2 :(得分:0)

您可以使用java8流api

Map<Object, Object> map = StreamSupport.stream(iterable.spliterator(), false)
                         .collect(Collectors.toMap(obj -> toKey(obj), 
                                                   obj -> toValue(obj)));