【问题标题】:Convert List<Map<Long, String>> to List<Long> Java 8将 List<Map<Long, String>> 转换为 List<Long> Java 8
【发布时间】:2019-07-31 13:34:43
【问题描述】:

我有一个地图列表,其中每个地图只有one key-value pair。我需要将其转换为键列表。我正在尝试按如下方式使用流:

List<Map<Long, String>> lst = // some data
List<Long> successList = lst.stream().map(ele -> ele.keySet().toArray()[0]).collect(Collectors.toList());

但我最终得到以下错误:

java: incompatible types: inference variable T has incompatible bounds
  equality constraints: java.lang.Long
  lower bounds: java.lang.Object

我该如何解决这个问题或者有更好的方法吗?

【问题讨论】:

  • 一个我发现对解决 IDE 中的类型推断错误很有用的提示:提取变量。这让 IDE 尝试推断类型:在这种情况下,successList 实际上类似于 List&lt;Object&gt;

标签: java dictionary collections java-8 java-stream


【解决方案1】:

使用Stream#flatMap,如下所示:

lst.stream()
   .flatMap(e->e.entrySet().stream())
   .map(e->e.getKey())
   .collect(Collectors.toList());

编辑:(根据评论)更优雅的方式是使用Map#keySet 而不是Map#entrySet

lst.stream()
   .flatMap(e -> e.keySet().stream())
   .collect(Collectors.toList());

【讨论】:

  • 虽然在这种情况下这是一个口味问题,但我认为Map.Entry::getKeye -&gt; e.getKey() 更冗长,并且它提供了更多上下文。仍然 +1。
  • 为什么不简单地flatMap(e-&gt;e.keySet().stream())
【解决方案2】:

你只需要:

List<Long> successList = lst.stream()
        .flatMap(e -> e.keySet().stream())
        .collect(Collectors.toList());

【讨论】:

    【解决方案3】:

    虽然已经发布了更好的答案(flatMap 是你的朋友),但我认为这里值得指出的是,打字错误源于使用 toArray 而没有参数。

    jshell> List<Long> a = Arrays.asList(1L, 2L, 3L, 4L)
    a ==> [1, 2, 3, 4]
    
    jshell> a.toArray()
    $2 ==> Object[4] { 1, 2, 3, 4 }
    

    看到了吗?当您使用不带参数的toArray 时,您会得到Object[] 类型的结果。所以改为这样做:

    jshell> a.toArray(new Long[1])
    $3 ==> Long[4] { 1, 2, 3, 4 }
    

    通过添加参数new Long[1],我们将toArray 的结果强制为您想要的Long 数组,而不是对象数组。

    JavaDoc for `toArray'

    【讨论】:

    • 如果我们确定只有一个元素,我们也可以使用new Long[1]。将使用这种方式传递的数组,而不是创建具有适当大小的新数组。
    【解决方案4】:

    使用这个:

    lst.stream().flatMap(m -> m.entrySet().stream()).map(Map.Entry::getKey).collect(toList());
    

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 2018-04-07
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多