【问题标题】:Java 8 Convert List of List of String to Map [closed]Java 8将字符串列表转换为映射[关闭]
【发布时间】:2019-05-08 05:19:58
【问题描述】:

我有List<List<String>>。我想根据内部 List 的特定元素将其转换为 Map。

我试过了

ddList.stream().flatMap(x -> x.stream()
            .collect(Collectors.toMap(Function.identity(), String::length)));

它不工作。这里出了什么问题?

【问题讨论】:

  • 向我们展示一些示例输入和输出数据,以便清楚地转换。
  • 您使用Map 调用flatMap,这是不正确的。您可能打算在这里关闭括号:.flatMap(x -> x.stream())?

标签: java lambda collections java-8


【解决方案1】:

应该是:

Map<String, Integer> sMap = 
    ddMap.stream()
         .flatMap(x -> x.stream())
         .collect(Collectors.toMap(Function.identity(),
                                   String::length));

附:如果输入 Lists 包含任何重复元素,则此代码将引发异常。您可以使用distinct 消除重复项:

Map<String, Integer> sMap = 
    ddMap.stream()
         .flatMap(x -> x.stream())
         .distinct()
         .collect(Collectors.toMap(Function.identity(),
                                   String::length));

编辑:

根据您的评论,您根本不需要flatMap,而是这样的:

Map<String, List<String>> sMap = 
    ddMap.stream()
         .collect(Collectors.toMap(l -> l.get(0), // or some other member 
                                                  // of the inner List
                                   Function.identity()));

【讨论】:

  • 我收到了java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List
  • 在这种情况下,ddMap 包含不是List&lt;String&gt; 的元素。也许您在某处使用了原始类型和不安全的类型转换。 @ruhewo
  • 感谢您的回复。我从 JPA Hibernate 查询中得到List&lt;List&lt;String&gt;&gt;。我想以特定元素作为地图的键来获取内部列表的地图。所以输出应该是Map&lt;String, List&lt;String&gt;&gt;
  • @ruhewo 那么你为什么使用String::length(返回int)作为值映射器?看看编辑答案是否是你想要的。也就是说,您得到的异常意味着您的 List 包含一个 Object[] 元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
相关资源
最近更新 更多