这是对老式循环的粗略翻译:
private List<Passenger> getPassengersToRelease() {
List<Passenger> result = new ArrayList<>();
for (Passenger p: passengerList()) {
if (p.getDestinationFloor() == currentFloor) {
result.add(p);
}
}
return result;
}
但是理解基于流的解决方案的更好方法是将其分解:
// give us the passengers as a stream
passengerList.stream()
// remove any passengers from the stream that DO NOT have the given
// destination floor.
.filter(user -> user.getDestinationFloor() == currentFloor)
// put the passengers that remain into a new list.
.collect(Collectors.toList);
唯一棘手的步骤是filter(...)步骤。作为参数传递给的东西filter是一个lambda 表达式。Passenger基本上,它是一个从 a 映射到一个boolean值的内联(未命名)函数。是函数的user输入变量,表达式的值user.getDestinationFloor() == currentFloor是它的输出。
所以过滤器是这样工作的。对于Passenger流中的每个,您调用 lambda 表达式。这为您提供true或false。如果你得到true你传递Passenger. 如果你把false它从流中删除;即它被“过滤掉”。