【发布时间】: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 -> someList.add(p))并改用收集器功能)。您可以做的是使用peek在每个人实例上执行doSomething,然后将生成的实例收集到一个列表中。List<Person> animalsList = rooms.stream().flatMap(r -> r.getPersonsList().stream()).filter(...).peek(p -> doSomething(p)).collect(...)); -
谢谢。只是出于好奇,我如何将 foreach 变为并行
-
getPersonsList().parallelStream()或stream().parallel()
标签: java-8 java-stream