Java 8消费者和副作用

时间:2016-05-18 00:13:40

标签: java

我是Java 8的新手,我遇到了Consumer java doc,它说:“预计消费者将通过副作用进行操作。”有人可以解释为什么这么说吗?

3 个答案:

答案 0 :(得分:13)

消费者的方法accept具有以下签名

void accept(T t);

该方法将t作为输入并且不返回任何内容(void),因此您无法从中返回任何内容并将方法调用替换为它返回的值。

副作用的一个例子是print语句,

list.stream.foreach(System.out::println);

foreach以消费者为参数。如果你考虑一下,你可以用这种方法做的唯一有用的事情是改变世界(即改变一个状态)。

与此相反的是pure function,一个不会改变任何状态的函数,它接受一个输入,并返回一些东西,例如

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

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

答案 1 :(得分:6)

根据Consumer javadoc,必须使用具有签名void accept(T)的方法声明使用者。结果,该方法不能返回值。如果它没有副作用,它将无法发挥任何效果。

答案 2 :(得分:4)

大多数功能接口只是 - 功能接口,严格意味着它们接受输入,进行一些计算并返回输出。他们不应该修改任何州。 Consumer是例外,因为它不会返回任何值;它的目的只是修改一些国家。