2015-04-09 2 views
0

Я могу это сделать:Использование гуавы для отображения коллекции с идентификатором

Map<Long, MyBean> mappedbean = Maps.uniqueIndex(myBeanList, toId); 

где

private final Function<BeanWithId, Long> toId= 
      new Function<BeanWithId, Long>() { 
       public Long apply(BeanWithId beanWithId) { 
        return beanWithId.getId(); 
       } 
      }; 

Но как создать карту подсписков, так что-то вроде этого:

Map<Long, List<MyBean>> mappedbean = Maps.somethingSomething(myBeanList, toId); 

, где идентификатор не является уникальным идентификатором на bean-компоненте.

Скучно старый для петли?

+0

А «скучный старый» цикл часто более прямой и читаемым ... –

ответ

2

Я бы не использовать Guava для этого, но Stream API из Java 8:

import static java.util.stream.Collectors.groupingBy; 

final Map<Long, List<MyBean>> mappedbean = myBeanList.stream() 
     .collect(groupingBy(MyBean::getId)); 

С гуавы, вы можете сделать:

final Map<Long, Collection<MyBean>> mappedbean = Multimaps.index(myBeanList, toId).asMap(); 

Несмотря на то, Multimaps.index, возвращает ImmutableListMultimap, из documentation for ListMultiMap:

Возвращенные значения карты - guara nteed для типа List. Чтобы получить эту карту с более конкретным общим типом Map<K, List<V>>, вместо этого вызовите Multimaps.asMap(ListMultimap).

Так литая к Map<Long, List> всегда будет в безопасности, а на самом деле вы можете сделать:

final Map<Long, List<MyBean>> mappedbean = Multimaps.asMap(Multimaps.index(myBeanList, toId)); 

Чтобы получить точный тип вы хотите. (Спасибо @Xaerxess за подсказку)

+0

спасибо, но я застрял с Java 1.6 и гуавы 11 :-( – NimChimpsky

+0

@NimChimpsky по-видимому, 'Multimaps. index' является [с 2.0] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimaps.html). –

+0

@BoristheSpider Приведение к 'Map > 'безопасен, так как он гарантирован [' ListMultimap # asMap'] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/ ListMultimap.html # asMap% 28% 29). Вы также можете использовать ['Multimaps # asMap (ListMultimap)'] (http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/ google/common/collect/Multimaps.html # asMap% 28com.google.common.collect.ListMultimap% 29) помощник здесь. – Xaerxess

Смежные вопросы