我是Java 8的新手,看到了Consumer Java文档中的内容,并且它说:“期望使用副作用来操作Consumer”。请问有人能解释一下为什么会这样说吗?
我是Java 8的新手,看到了Consumer Java文档中的内容,并且它说:“期望使用副作用来操作Consumer”。请问有人能解释一下为什么会这样说吗?
消费者有一个带有以下签名的方法accept
void accept(T t);
list.stream.foreach(System.out::println);
foreach方法需要一个Consumer作为参数。如果你仔细思考一下,使用这种方法唯一有用的事情就是改变世界(即改变状态)。
相反的是pure function,它不会改变任何状态,它只接受输入并返回结果,例如:
Function<Integer,Integer> fn = x -> x*x;
fn
没有任何副作用(不会改变任何东西),它接收一个整数并平静地返回它的平方。println
被认为是副作用?似乎它并没有改变任何东西。 - Liam linConsumer
javadoc,一个消费者必须声明一个具有签名void accept(T)
的方法。因此,该方法无法返回值。若没有副作用,它将无法产生任何效果。大多数功能接口都是为此而设计的 - 功能接口,严格意义上意味着它们接受一个输入,进行一些计算,并返回一个输出。它们不应该修改任何状态。Consumer
是一个例外,因为它不返回任何值;它的目的仅仅是修改一些状态。