Guava有将可迭代对象转化为唯一类型映射的方法吗?

10
我找不到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是字符串的情况。

可能是重复的问题:Guava: Set<K> + Function<K,V> = Map<K,V>? - Sean Patrick Floyd
3个回答

13
我知道的最接近的是 Maps.uniqueIndex - 它处理了键,但没有处理值... 这是否足够接近?

你可能可以使用:

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

有点别扭,但我认为这可以完成工作...


是的,对于这种情况它有效,但我想知道在类型灵活性方面有多少余地。 - TDJoe

1

0
你可以使用Java 8的stream API实现它。
Map<Object, Object> map = StreamSupport.stream(iterable.spliterator(), false)
                         .collect(Collectors.toMap(obj -> toKey(obj), 
                                                   obj -> toValue(obj)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接