【问题标题】:How to flatten a list of objects containing a list and pass each element into a method? [duplicate]如何展平包含列表的对象列表并将每个元素传递给方法? [复制]
【发布时间】:2019-07-08 20:46:39
【问题描述】:

给定以下实体:

public class Parent extends {
    private Long id;    
    private List<Child> children = new ArrayList<>();
}

我正在尝试学习如何使用 Java 8 Stream API 来扁平化一个 List&lt;Parent&gt;,每个都包含一个 List&lt;Child&gt;,并将 Child 的流传递给一个 void 方法。

例如:

List<Parent> parents = //..

schedules.stream()
        .flatMap(Parent::getChildren)
        .forEach(this::invoke);

这给出了错误:

方法参考中的错误返回类型:无法将 java.util.List 转换为 java.util.stream.Stream

【问题讨论】:

  • 你 flatMap 到一个流。所以.flatMap(parent -&gt; parent.getChildren().stream())
  • 另外我认为,如果第一个操作的子节点本身有任何子节点,则平面地图构造不会递归调用getChildren。这只是一个级别的孩子。

标签: java java-stream


【解决方案1】:

Stream.flatMap() 需要一个 Function,它返回一个 Stream 作为参数。您正在尝试传递一个Function,它返回一个List。改用这个:

List<Parent> parents = ...;
parents.stream()
        .flatMap(p -> p.getChildren().stream())
        .forEach(this::invoke);

您也可以使用Stream.map() 和Stream.flatMap():

parents.stream()
        .map(Parent::getChildren)
        .flatMap(Collection::stream)
        .forEach(this::invoke);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 2019-10-21
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多