使用guava将集合映射到id

时间:2015-04-09 09:34:11

标签: java collections hashmap guava

我可以这样做:

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);

其中id不是bean上的唯一标识符。

一个无聊的旧 for loop

1 个答案:

答案 0 :(得分:2)

我不会使用Guava,但Java 8的Stream API:

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会从documentation for ListMultiMap

返回ImmutableListMultimap
  

返回的地图的值保证为List类型。要使用更具体的通用类型Map<K, List<V>>获取此地图,请改为调用Multimaps.asMap(ListMultimap)

所以对Map<Long, List>的演员总是安全的,事实上你可以这样做:

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

获取您想要的确切类型。 (感谢@Xaerxess提示)