我想要一个简单的Java 8 Streams
示例来理解它。我有此代码可返回免费出租车。我想将其for循环替换为使用Java 8流的等效代码:
private List<Taxi> taxis = new ArrayList<Taxi>();
Taxi scheduleTaxi(){
for (Taxi taxi : taxis) {
if (taxi.isFree()) {
return taxi;
}
}
return null;
}
我遍历
taxis
的列表,并评估taxi
是否符合条件。如果条件适用,我将停止循环并返回taxi
。有什么建议?
最佳答案
您正在寻找的是:
return taxis.stream()
.filter(Taxi::isFree)
.findFirst()
.orElse(null);
这是表达式步骤及其返回类型和javadoc链接的列表:
表达式步骤 | 类型。 替代
taxis
| List<Taxi>
stream()
| Stream<Taxi>
| parallelStream()
filter(Taxi::isFree)
| Stream<Taxi>
findFirst()
| Optional<Taxi>
| findAny()
orElse(null)
| Taxi
| |无,请参见下文filter(Taxi::isFree)
调用使用的是method reference。也可以使用lambda expression编写它:
filter(t -> t.isFree())
或使用lambda表达式块:
filter(t -> {
return t.isFree();
})
该参数还可以指定一个类型,更明确地说:
filter((Taxi t) -> { return t.isFree(); })
这使它看起来更像anonymous class,它等效于:
filter(new Predicate<Taxi>() {
@Override
public boolean test(Taxi t) {
return t.isFree();
}
})
作为@ 4castle mentioned in a comment,根据
scheduleTaxi()
方法的需要,您可能想要更改返回类型并跳过最后一步,以向调用者明确表明它可能找不到出租车。Optional<Taxi> scheduleTaxi() {
return taxis.stream().filter(Taxi::isFree).findFirst();
}