Есть ли у guava метод для превращения итерации в карту уникальных типов?

Я не смог найти метод в 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 является строкой.

Ответ 1

Ближайшим, о котором я знаю, является Maps.uniqueIndex - что делает ключевая сторона, но не сторона значения... это достаточно близко?

Вы можете использовать:

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

Немного неудобно, но я думаю, что это выполнит свою работу...

Ответ 2

Как отметил Джон Скит, 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