【问题标题】:How to collect from a stream which maps to multiple results? [duplicate]如何从映射到多个结果的流中收集? [复制]
【发布时间】:2018-07-04 00:06:59
【问题描述】:

我想通过调用expand() 来映射列表中的每个条目,这会返回多个条目,然后将结果收集为一个列表。

如果没有流,我会这样做:

    List<String> myList = new ArrayList<>();
    List<String> expanded = new ArrayList<>();
    for (String s : myList) {
        expanded.addAll(expand(s));
    }
    return expanded;

    private List<String> expand(String x) {
        return Arrays.asList(x, x, x);
    }

如何使用流来实现这一点?这会产生编译错误:

return myList.stream().map(this::expand).collect(Collectors.toList());

【问题讨论】:

  • myList.stream() .flatMap(x -&gt; Stream.of(x, x, x)) .collect(Collectors.toList());

标签: java java-8 java-stream


【解决方案1】:
return myList.stream().map(this::expand).collect(Collectors.toList());

返回List&lt;List&lt;String&gt;&gt;,因为myList.stream().map(this::expand) 返回一个类型为Stream&lt;List&lt;String&gt;&gt; 的流,因为您将一个声明为List&lt;String&gt; 的变量而不是String 传递给map()

你不想这样。

所以链 Stream.map()Stream.flatMap() 合并 Stream&lt;List&lt;String&gt;&gt;Stream&lt;String&gt;

return myList.stream()
             .map(this::expand)
             .flatMap(x->x.stream())
             .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    使用flatMapStream&lt;List&lt;String&gt; 转换为Stream&lt;String&gt;return myList.stream().map(this::expand).flatMap(Collection::stream).collect(Collectors.toList());

    【讨论】:

      【解决方案3】:

      flatMap 应该可以帮到你:

      return myList.stream()
              .flatMap(x -> expand(x).stream())
              .collect(Collectors.toList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-27
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多