请看下面的代码片段。
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
List<String> copyList = new ArrayList<String>();
Consumer<String> consumer = s->copyList.add(s);
list.stream().forEach(consumer);
由于我们正在使用lambda表达式,根据函数式编程(纯函数)的规定,它应该仅计算输入并提供相应的输出。
但在此示例中,它尝试将元素添加到列表中,而该列表既不是输入也不是在lambda作用域内声明的。
这是一种好的做法吗?会导致任何副作用吗?
list.stream().forEach(copyList::add);
。 - GlainsforEach
从来都不是纯函数,因为如果没有副作用,它就无法对流执行任何操作。这适用于Scheme中的for-each
,JS中的Array.forEach
等。 - Sylwester