当前位置: 首页 > 知识库问答 >
问题:

使用Java8流过滤和收集嵌套的集合元素

祖奇
2023-03-14

我有一个对象的集合,每个对象都有一个元素的集合,例如:

public class Parent {
    private Collection<Child> children;
}

public class Child {
    private String type;
}

如何使用Java 8函数式编程来过滤和收集类型等于“a”的Child集合?

我尝试了以下方法

Collection<Child> filteredChildren = parents.stream()
                                        .forEach(p ->
                                            filteredChildren.addAll(p.getChildren().stream()
                                                          .filter(c -> c.getType().equals("A"))
                                                          .collect(Collectors.toList()))
                                        );

但我得到以下错误:

变量'filteredChildren'初始值设定项'parents。stream()。forEach(p-

如何按类型筛选嵌套集合并收集它们?

共有2个答案

郜杰
2023-03-14

你可以做的是在parents集合中进行流式处理,将他们的孩子平铺,并过滤那些类型等于“A”的孩子。

parents.stream()
    .map(Parent::getChildren)
    .flatMap(Collection::stream)
    .filter(children -> "A".equals(children.getType()))
    .collect(Collectors.toList());
龙凯
2023-03-14

在终端Stream操作的代码中使用foreach是错误的,因为它不产生输出,所以您不能将其分配给filteredCRC变量。

使用flatMap获取所有父实例的子实例(按类型过滤)的平面流,然后收集到列表

Collection<Child> filteredChildren = 
    parents.stream()
           .flatMap(p -> p.getChildren()
                          .stream()
                          .filter(c -> c.getType().equals("A")))
           .collect(Collectors.toList());

 类似资料:
  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我试图理解新的Java8流,并且花了好几天的时间在Java8流中的集合上传输嵌套的foreach循环。 是否可以重构以下嵌套的foreach循环,包括Java-8-Streams中的if条件? 如果是,它会是什么样子。 非常感谢你的帮助。 溴

  • 2020-07-08->{0->{hourquarter.first->5.5,ehourquarter.second->10.2,...},1->{ehourquarter.first->33.2,ehourquarter.second->30.1,...},...} 它是一个整数图(小时:从0到23)的局部日期图,二倍的每小时四分之一图。 我需要得到一个包含每个日期累加的map >,这意味着如

  • 设备类型.java DeviceTelemetry.java (枚举类) 我想获取所有DeviceType Id,它们的DeviceTelem计名称以“System”(String)开头。 我做了这样的事情:— 谁能告诉我如何从中获取DeviceType Id?

  • 假设我有一个,还有一个,它匹配我想从中删除的元素。但我不只是想丢弃它们,我想将匹配的元素移动到一个新集合中。在Java 7中,我会这样做: 我很好奇是否有一个流/Java8方法来做这件事。不幸地只是返回一个(甚至没有删除元素的数量?太糟糕了。)我设想了这样的东西(当然不存在): 注:此问题受类似问题启发;这个问题是关于在从集合中移除的项上获取流的更一般的情况。正如链接问题中所指出的,命令式解决方案