我的问题涉及Java 5中引入的Java循环和Java8中引入的Iterable.forEach()。
假设程序存在一个字符串值列表,该程序的功能是遍历每个单独的字符串,并将其用作方法参数。
在Java 5中,这样的程序看起来可能是这样的:
for (String s : stringList) {
doSomething(s);
}但是,在Java8中引入Iterable.forEach()之后,这样的程序可能如下所示:
stringList.forEach(this::doSomething);我的问题是,除了节省几行代码之外,还有什么理由使用Iterable.forEach()而不是foreach循环呢?
发布于 2016-06-25 14:33:44
提供一个forEach使要对元素执行的操作具有可插拔性和非常灵活的特性。它可以是直接的lambda、MethodHandle,甚至是由行为的静态部分和运行时定义的部分动态组成的MethodHanlde。在内部,可以避免创建显式Iterator对象。否则,您当然可以通过外部循环模拟相同的行为。不过,这看起来可能不太好。
发布于 2016-06-25 14:40:53
以下是两者之间的三个不同之处:
forEach不允许break/continue。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
}
});void method() throws Exception {
...
for(MyClass e : list) {
...
throw new Exception("Oops");
}
list.forEach(e -> {
...
throw new Exception("Oops"); // Error: unhandled exception
});
}发布于 2016-06-25 14:35:02
最基本的好处是,如果库决定这样做,您可以使用forEach进行内部迭代。在使用增强型for循环(for x : xs)时,您必须坚持外部迭代。
这样做的想法是,您需要一些函数来获取列表(或Iterable)中的每个元素,并对其执行一些操作。非功能性(传统的Java语言)是迭代代码中的列表并执行它。这称为外部迭代。这强制执行顺序执行。
使用Java 8,您可以创建和传递lambda表达式。因此,您传递接受元素的行为或函数。因此,您放弃了对迭代的控制,让列表实现(可以说是库代码)来处理迭代,可能会并行化这些工作。
https://stackoverflow.com/questions/38029479
复制相似问题