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

Я не смог найти в гуаве метод, который преобразует коллекцию (или итератор/итератор) в карту, что-то вроде следующего (для ясности подстановочные знаки опущены):

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 является строкой.


person TDJoe    schedule 13.10.2011    source источник
comment
возможный дубликат Guava: Set‹K› + Function‹K,V› = Map‹K ,V›?   -  person Sean Patrick Floyd    schedule 14.10.2011


Ответы (3)


Самое близкое, что мне известно, это Maps.uniqueIndex — это ключевая сторона, но не значение... это достаточно близко?

Вы могли бы потенциально использовать:

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

Немного неловко, но, думаю, со своей задачей справится...

person Jon Skeet    schedule 13.10.2011
comment
Да, это сработало для этого случая, хотя мне интересно, насколько это гибко с типами. - person TDJoe; 14.10.2011

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

person Etienne Neveu    schedule 13.10.2011

Вы можете сделать это с помощью потокового API java8.

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