gpt4 book ai didi

java - java 8 中 lambda 表达式的副作用

转载 作者:行者123 更新时间:2023-12-02 16:15:40 24 4
gpt4 key购买 nike

请考虑以下代码片段。

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 范围内声明的。

我的意思是,这是一个好的做法,会导致任何副作用吗?

最佳答案

forEach如果它不产生副作用,那么它就没用,因为它没有返回值。因此,每当您使用forEach时您应该预料到会发生副作用。因此你的例子没有任何问题。

一个Consumer<String>可以打印String ,或者将其插入某个数据库,或者将其写入某个输出文件,或者将其存储在某个 Collection 中(如您的示例)等...

来自Stream Javadoc:

A stream pipeline consists of a source (which might be an array, a collection, a generator function, an I/O channel, etc), zero or more intermediate operations (which transform a stream into another stream, such as Stream.filter(Predicate)), and a terminal operation (which produces a result or side-effect, such as Stream.count() or Stream.forEach(Consumer)).

此外,如果您查看 Consumer 的 Javadoc ,您会发现它预计会产生副作用:

java.util.function.Consumer

Represents an operation that accepts a single input argument and returns no result. Unlike most other functional interfaces, Consumer is expected to operate via side-effects.

我猜这意味着Java Stream s 和函数式接口(interface)并非设计用于仅用于“纯”函数式编程。

关于java - java 8 中 lambda 表达式的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51761334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com