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.
有什么建议?
使用最新的IntelliJ IDEA 2016.3 EAP(社区版或终极版),您可以自动转换它.只需将光标放在for循环上:
按Alt-Enter并选择"替换为findFirst()":
瞧,它已经完成了!
免责声明:我是IntelliJ IDEA开发人员.
你在寻找的是:
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)
| 归档时间: |
|
| 查看次数: |
933 次 |
| 最近记录: |