Java 8 消费者与副作用

22

我是Java 8的新手,看到了Consumer Java文档中的内容,并且它说:“期望使用副作用来操作Consumer”。请问有人能解释一下为什么会这样说吗?


12
如果你不熟悉函数式编程,那这种语言对你来说可能并没有太大意义。其核心思想是"纯"函数只从输入中读取数据,并将结果写入返回值中(因此不会有副作用——运行函数的唯一影响是获得返回值)。那些更改某些东西的函数(修改数据结构,运行IO等)被认为具有副作用。如果一个函数没有返回值,最好具有副作用,否则它就什么都没做。 - Edward Peters
@EdwardPeters 从方法中抛出异常算作副作用吗? - JavaLearner
3个回答

20

消费者有一个带有以下签名的方法accept

void accept(T t);

这个方法以t作为输入,没有返回任何值(void),因此你不能从中返回任何东西并用它返回的值替换方法调用。
副作用的一个例子是打印语句。
list.stream.foreach(System.out::println);

foreach方法需要一个Consumer作为参数。如果你仔细思考一下,使用这种方法唯一有用的事情就是改变世界(即改变状态)。

相反的是pure function,它不会改变任何状态,它只接受输入并返回结果,例如:

Function<Integer,Integer> fn = x -> x*x;

这里的fn没有任何副作用(不会改变任何东西),它接收一个整数并平静地返回它的平方。

为什么println被认为是副作用?似乎它并没有改变任何东西。 - Liam lin

8
根据Consumer javadoc,一个消费者必须声明一个具有签名void accept(T)的方法。因此,该方法无法返回值。若没有副作用,它将无法产生任何效果。

如果它没有副作用,那么它就无法产生任何效果。 - Praveen Tiwari

5

大多数功能接口都是为此而设计的 - 功能接口,严格意义上意味着它们接受一个输入,进行一些计算,并返回一个输出。它们不应该修改任何状态。Consumer是一个例外,因为它不返回任何值;它的目的仅仅是修改一些状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接