【问题标题】:How to build a Map<Object, List<Object>> map from a List<Object>如何从 List<Object> 构建 Map<Object, List<Object>> 地图
【发布时间】:2018-10-19 14:14:15
【问题描述】:

我构建了一个 idMap 如下:

class Item {
    private int id;
    private int skuId;
    //some getter and setter
}

Map<Integer, List<Integer>> buildIdMap(List<Item> items) {

    Map<Integer, List<Integer> idMap = Maps.newHashMap();

    for (Item item : items) {
        if (!idMap.contains(item.getId())) {
            idMap.put(item.getId(), List.newArrayList());
        }
        idMap.put(item.getId(), item.getSkuId());
    }
    return idMap;
}

如何使用 guava 或 java8 来做同样的事情?

【问题讨论】:

  • Map&lt;Integer, List&lt;Integer&gt; 您有多个这样的语法错误(没有&gt;),并且缺少多个分号。你的方法也没有返回任何东西。
  • 什么是item.getSkuId()?这段代码也没有什么意义,请考虑一下:如果您的地图不包含 id - 您通过 idMap.put(item.getId(), List.newArrayList()) 将其放入,仅在通过 idMap.put(item.getId(), item.getSkuId()) 覆盖该值之后 - 如代码所示,我是投票关闭它不清楚,一旦你更新它并更有意义,我将撤回投票

标签: list java-8 guava


【解决方案1】:

您可以使用 Java8 这样做,

Map<Integer, List<Integer>> idMap = items.stream()
        .collect(Collectors.groupingBy(Item::getId, 
                Collectors.mapping(Item::getSkuId, Collectors.toList())));

【讨论】:

    【解决方案2】:

    使用 Guava 的Multimaps.index(Iterable&lt;V&gt;,Function&lt;? super V,K&gt;):

    Multimap<Integer, Item> buildIdMap(List<Item> items) {
      return Multimaps.index(items, Item::getId);
    }
    

    我认为这不是您所要求的,但它会比您期望的方法做得更好。

    【讨论】:

    • 那么item.getSkuId() 呢?
    • 好吧,我没有投反对票,但有点期待这个知道所以......即使这是一个好方法,也可能是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 2022-07-11
    • 2021-04-29
    • 1970-01-01
    • 2019-04-06
    相关资源
    最近更新 更多