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

java8流-过滤器映射和聚合

夏志国
2023-03-14

假设我有一张房间清单

List<Room> rooms;

每个房间都有一份人员名单。

使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。

这是使用java 8的最佳实践吗?

List<Asset> pesonsList= new ArrayList<>();
for (Room room : rooms) 
     room.getPersonsList().stream()
                       .filter(person -> person.isTall())
                       .forEach(person -> {
                               doSomething(person);
                               pesonsList.add(person);
                       });

共有2个答案

樊桐
2023-03-14

除了@JBNizet的答案之外,我建议将Room类中的getSpensList()替换为People()方法:而不是

List<Person> getPersonsList() {...}

创建此方法:

Stream<Person> persons() {...}

第一个优点是流操作将变得更短:

List<Person> persons = rooms.stream()
     .flatMap(Room::persons)
     .filter(Person::isTall)
     .peek(this::doSomething)
     .collect(Collectors.toList());

第二个优点是,它可能更独立于实现,因此效率更高。假设您在内部将人员存储集合或数组中。使用getPersonList()方法时,需要首先将所有人员复制到新列表中。使用persons()方法时,您可以轻松地直接从内部数据结构创建流。我相信,如果它是List或array或其他什么,它是Java8返回内部对象流的方法,而不是返回一些特定的数据结构。

子车文康
2023-03-14

你最好这样做:

List<Person> persons = 
    rooms.stream()
         .flatMap(room -> room.getPersonsList().stream())
         .filter(Person::isTall)
         .peek(this::doSomething)
         .collect(Collectors.toList());
 类似资料:
  • 我正在用Java8为一个文件编写一个解析器。使用读取该文件,并返回一个顺序的。 每一行都映射到一个数据对象,如下所示: 现在我们可以将流中的每一行映射到相应的结果: 但是,流现在包含要删除的值: 如我在中所知,如果需要结果,我如何组合映射/筛选操作?

  • 我刚开始使用RxJava/RxAndroid,在理解如何正确处理背压方面有一些问题。 我有一个文件扫描器,可以扫描目录并发出文件。应尽快处理这些文件,并且不跳过任何文件。 所以管道看起来像这样:<代码>可观察 不幸的是,我收到了rx。例外情况。缺少背压异常错误。所以我读了关于背压的书,如果我理解正确的话,无损耗选项只是缓冲区和窗口。 我试过了BackPressureBuffer()、buffer(

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

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

  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。