【问题标题】:Use guava to map collection to id使用 guava 将集合映射到 id
【发布时间】:2015-06-14 14:27:31
【问题描述】:

我能做到:

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 循环

【问题讨论】:

  • 一个“无聊的老” for 循环通常更直接和可读...

标签: java collections hashmap guava


【解决方案1】:

我不会为此使用 Guava,而是使用 Java 8 的 Stream API:

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

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

使用 Guava,您可以:

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

虽然Multimaps.indexdocumentation for ListMultiMap 返回一个ImmutableListMultimap

返回的地图值保证是 List 类型。要使用更具体的泛型类型Map&lt;K, List&lt;V&gt;&gt; 获取此映射,请改为调用Multimaps.asMap(ListMultimap)

所以投到Map&lt;Long, List&gt; 总是安全的,事实上你可以这样做:

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

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

【讨论】:

猜你喜欢
  • 2015-07-13
  • 2021-12-09
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多