从for循环到Java 8 Stream示例

Tak*_*iii 3 java for-loop java-8 java-stream

我想要一个简单的Java 8例子Streams来理解它.我有这个代码,返回一个免费的出租车.我想用使用Java 8流的等效代码替换这个for循环:

private List<Taxi> taxis = new ArrayList<Taxi>();

Taxi scheduleTaxi(){
    for (Taxi taxi : taxis) {
        if (taxi.isFree()) {
            return taxi;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

我迭代一个列表taxis,并评估是否taxi尊重条件.如果条件适用,我停止循环并返回taxi.

有什么建议?

Tag*_*eev 9

使用最新的IntelliJ IDEA 2016.3 EAP(社区版或终极版),您可以自动转换它.只需将光标放在for循环上:

理念

按Alt-Enter并选择"替换为findFirst()":

理念

瞧,它已经完成了!

理念

免责声明:我是IntelliJ IDEA开发人员.


And*_*eas 7

你在寻找的是:

return taxis.stream()
            .filter(Taxi::isFree)
            .findFirst()
            .orElse(null);
Run Code Online (Sandbox Code Playgroud)

以下是表达式步骤的列表及其返回类型和javadoc的链接:

表达步骤         | 输入                    | 替代品
taxis                           |                      |     | |                 | |               |                   | 没有,见下文List<Taxi>
stream()Stream<Taxi>parallelStream()
filter(Taxi::isFree)Stream<Taxi>
findFirst()Optional<Taxi>findAny()
orElse(null)Taxi


filter(Taxi::isFree)调用使用方法引用.
它也可以使用lambda表达式编写:

filter(t -> t.isFree())
Run Code Online (Sandbox Code Playgroud)

或使用lambda表达式块:

filter(t -> {
    return t.isFree();
})
Run Code Online (Sandbox Code Playgroud)

该参数还可以指定一个类型,更明确:

filter((Taxi t) -> { return t.isFree(); })
Run Code Online (Sandbox Code Playgroud)

这使它看起来更像是匿名类,相当于:

filter(new Predicate<Taxi>() {
    @Override
    public boolean test(Taxi t) {
        return t.isFree();
    }
})
Run Code Online (Sandbox Code Playgroud)

正如@ 4castle 在评论中提到的,根据您的scheduleTaxi()方法的需要,您可能希望更改返回类型并跳过最后一步,以使调用者明白它可能无法找到出租车.

Optional<Taxi> scheduleTaxi() {
    return taxis.stream().filter(Taxi::isFree).findFirst();
}
Run Code Online (Sandbox Code Playgroud)