Gin*_*hot 2 java foreach iterator java-8
我的问题涉及Java 5中引入的Java foreach循环,以及Iterable.forEach()Java 8中引入的.
假设存在一个带有List of String值的程序,该程序的功能是迭代每个单独的字符串并将其用作方法参数.
从Java 5开始,这样的程序看起来像这样:
for (String s : stringList) {
doSomething(s);
}
Run Code Online (Sandbox Code Playgroud)
但是,随着Iterable.forEach()Java 8 的引入,这样的程序看起来像这样:
stringList.forEach(this::doSomething);
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有理由使用Iterable.forEach()foreach循环而不是保存几行?
提供forEach使得可以在可插拔元件上执行的动作并且非常灵活.它可以是一个直接的lambda,一个MethodHandle,甚至是一个MethodHanlde,它是由行为的静态部分和运行时定义的部分动态组成的.在内部,Iterator可以避免创建显式对象.否则,您当然可以通过外部循环模拟相同的行为.这可能看起来不太好看.
以下是两者之间要考虑的3个差异:
Lambdas无法捕获非最终变量.
A forEach不允许break/ continue.
必须在传递的lambda中捕获已检查的异常(因为类型是Consumer<...>).
List<MyClass> list = ...;
MyClass mc = null;
for(MyClass e : list) {
if(e.test("bla")) {
mc = e;
break;
}
}
list.forEach(e -> {
if(e.test("bla")) {
mc = e; // Does not compile
break; // Also, does not compile
}
});
Run Code Online (Sandbox Code Playgroud)
void method() throws Exception {
...
for(MyClass e : list) {
...
throw new Exception("Oops");
}
list.forEach(e -> {
...
throw new Exception("Oops"); // Error: unhandled exception
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |