【问题标题】:Java 8 Consumer and side effectsJava 8 消费者和副作用
【发布时间】:2016-09-14 06:23:17
【问题描述】:

我是 Java 8 的新手,我遇到了 Consumer java doc,上面写着:“Consumer 应该通过副作用进行操作。”有人能解释一下为什么这么说吗?

【问题讨论】:

  • 如果您不习惯函数式编程,那么该语言对您来说意义不大。这个想法是“纯”函数应该只从它们的输入中读取,并且只写入它们的返回值(所以不会有副作用 - 运行函数的唯一效果是你得到返回值。)改变的函数某些东西(修改数据结构、运行 IO 等)据说有副作用。没有返回值的函数最好有副作用,否则它什么也做不了。

标签: java java-8 consumer


【解决方案1】:

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

【讨论】:

  • “如果它没有副作用,它将无法执行任何效果。” - 告诉一切
【解决方案2】:

大多数函数式接口都只是 - 函数式 接口,这严格意味着它们接受输入、进行一些计算并返回输出。他们不应该修改任何状态。 Consumer 是个例外,因为它不返回任何值;它的目的仅仅是为了修改一些状态。

【讨论】:

    【解决方案3】:

    消费者拥有方法accept,签名如下

    void accept(T t);
    

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-20
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多