java8 stream - 过滤地图和聚合

时间:2015-05-10 12:25:46

标签: java-8 java-stream

假设我有一个房间列表

{
  "example": [
    {
      "query": {
        "text": "string 1",
        "id": [
          {
            "timestamp": "1234567890123456"
          }
        ]
      }
    },
    {
      "query": {
        "text": "string 2",
        "id": [
          {
            "timestamp": "1234567891123456"
          }
        ]
      }
    },
    {
      "query": {
        "text": "string 3",
        "id": [
          {
            "timestamp": "1234567893123456"
          }
        ]
      }
    }
  ]
}

每个房间都有人员名单。

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

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

List<Room> rooms;

2 个答案:

答案 0 :(得分:6)

你最好这样做:

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

答案 1 :(得分:2)

除了@JBNizet答案之外,我建议用getPersonsList()方法替换Room课程中的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或数组或其他。