假设我有一个房间列表
{
"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;
答案 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
或数组或其他。