【问题标题】:java8 stream - filter map and aggregatejava8 stream - 过滤映射和聚合
【发布时间】:2015-05-10 12:25:45
【问题描述】:

假设我有一个房间列表

List<Room> rooms;

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

使用 java8 流 我想迭代房间列表,获取所有人,在每个节点上执行一些方法 (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);
                       });

【问题讨论】:

  • 什么是动物?什么是动物列表? doSomething() 有什么作用?
  • 如果您将流并行化,forEach 可以将元素添加到列表中,因此如果未正确同步,您可能会遇到问题。您应该避免这种编程风格(即forEach(p -&gt; someList.add(p)) 并改用收集器功能)。您可以做的是使用peek 在每个人实例上执行doSomething,然后将生成的实例收集到一个列表中。 List&lt;Person&gt; animalsList = rooms.stream().flatMap(r -&gt; r.getPersonsList().stream()).filter(...).peek(p -&gt; doSomething(p)).collect(...));
  • 谢谢。只是出于好奇,我如何将 foreach 变为并行
  • getPersonsList().parallelStream()stream().parallel()

标签: java-8 java-stream


【解决方案1】:

你最好这样做:

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

【讨论】:

  • 警告“peek”可能会影响并发。如果“doSomething”不是线程安全的,那么您就有可能导致意外行为。
【解决方案2】:

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

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

创建这个方法:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2021-04-20
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多