首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Iterable.forEach来代替foreach循环是纯粹的化妆品吗?

用Iterable.forEach来代替foreach循环是纯粹的化妆品吗?
EN

Stack Overflow用户
提问于 2016-06-25 14:23:11
回答 4查看 532关注 0票数 2

我的问题涉及Java 5中引入的Java循环和Java8中引入的Iterable.forEach()

假设程序存在一个字符串值列表,该程序的功能是遍历每个单独的字符串,并将其用作方法参数。

在Java 5中,这样的程序看起来可能是这样的:

代码语言:javascript
复制
for (String s : stringList) {
    doSomething(s);
}

但是,在Java8中引入Iterable.forEach()之后,这样的程序可能如下所示:

代码语言:javascript
复制
stringList.forEach(this::doSomething);

我的问题是,除了节省几行代码之外,还有什么理由使用Iterable.forEach()而不是foreach循环呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-06-25 14:33:44

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

票数 5
EN

Stack Overflow用户

发布于 2016-06-25 14:40:53

以下是两者之间的三个不同之处:

  • Lambdas不能捕获非最终变量。
  • forEach不允许break/continue
  • 检查的异常必须在传递的lambda中捕获(因为类型是Consumer<...>)。
代码语言:javascript
复制
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
    }
});
代码语言:javascript
复制
void method() throws Exception {        
    ...
    for(MyClass e : list) {
        ...
        throw new Exception("Oops");
    }

    list.forEach(e -> {
        ...
        throw new Exception("Oops"); // Error: unhandled exception
    });
}
票数 5
EN

Stack Overflow用户

发布于 2016-06-25 14:35:02

最基本的好处是,如果库决定这样做,您可以使用forEach进行内部迭代。在使用增强型for循环(for x : xs)时,您必须坚持外部迭代。

这样做的想法是,您需要一些函数来获取列表(或Iterable)中的每个元素,并对其执行一些操作。非功能性(传统的Java语言)是迭代代码中的列表并执行它。这称为外部迭代。这强制执行顺序执行。

使用Java 8,您可以创建和传递lambda表达式。因此,您传递接受元素的行为或函数。因此,您放弃了对迭代的控制,让列表实现(可以说是库代码)来处理迭代,可能会并行化这些工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38029479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档