【问题标题】:Convert Map<Long, MyObject> to Map<Long, List<MyObject>>将 Map<Long, MyObject> 转换为 Map<Long, List<MyObject>>
【发布时间】:2016-03-24 11:07:26
【问题描述】:

使用 java8 和流 api。

MyObject只有一个,我要转换

Map<Long, MyObject> 

Map<Long, List<MyObject>>

列表有一个元素?

【问题讨论】:

  • 如果你只有一把钥匙,为什么要使用地图?而不是一组?
  • @ManuelS 一个值,而不是一个键。
  • 只有一个 MyObject...den 为什么要使用 List ??
  • 我建议你看看 Guava MultiMap。它是一个谷歌库,为该数据结构提供了一种非常好的方法。请查看this 帖子中的示例。
  • @SarithaG 有很多原因。您是否需要知道我正在为其制作的 api,或者我的所有业务需求才能回答这个问题?

标签: java java-8 java-stream


【解决方案1】:
Map<Long, List<MyObject>> newMap = oldMap.entrySet().stream()
                 .collect(Collectors.toMap(
                            Entry::getKey, 
                            e -> new ArrayList<>(Arrays.asList(e.getValue()))));

如果 value 中的不可变列表没问题,最后一行可能会简化一点:

                            e -> Collections.nCopies(1, e.getValue())));

【讨论】:

  • 这个 lambda 表达式对于 OP 来说可能有点过头了,因为他似乎是一个初学者,但答案仍然有效且正确。 +1
  • @RoelStrolenberg OP 有一个金色的 java 徽章,我不认为他这么绿。
【解决方案2】:

您可以只获取条目集流并使用toMap 收集器与Collections.singletonList(创建不可变列表)结合使用从原始映射创建新值。

Map<Long, List<MyObject>> transformedMap = 
    map.entrySet()
       .stream()
       .collect(toMap(Map.Entry::getKey, 
                      e -> Collections.singletonList(e.getValue())));

【讨论】:

    【解决方案3】:
    Map<Long, MyObject> yourMap = whateverYouImplementedHere;
    Map<Long, List<MyObject>> listMap = new HashMap<>();
    
    for (Entry<Long, MyObject> entry : yourMap.entrySet()){
    
        listMap.put(entry.getKey(), new ArrayList<MyObject>(Arrays.asList(entry.getValue()));
    }
    

    【讨论】:

    • 这将解决 OP 的一般问题,尽管其他数据结构要好得多
    • 这没有使用 java 8 的流特性
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 2018-04-07
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2011-11-25
    • 2018-11-28
    相关资源
    最近更新 更多