我想要一个简单的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();
}

10-06 09:40