用Iterable.forEach替换foreach循环纯粹是化妆品吗?

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循环而不是保存几行?

Tho*_*ser 5

提供forEach使得可以在可插拔元件上执行的动作并且非常灵活.它可以是一个直接的lambda,一个MethodHandle,甚至是一个MethodHanlde,它是由行为的静态部分和运行时定义的部分动态组成的.在内部,Iterator可以避免创建显式对象.否则,您当然可以通过外部循环模拟相同的行为.这可能看起来不太好看.

  • @Deadshot与for-each循环相比,它也有一些显着的局限性.您不能使用非本地控制流(中断/继续)来执行操作; 你不能访问高级可变的本地人; 并且即使封闭方法声明它们,也不能抛出已检查的异常.一个不能取代另一个. (2认同)

Jor*_*nee 5

以下是两者之间要考虑的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)

  • 你也忘了:检查异常(即使声明封闭方法抛出它们). (2认同)