2016-04-22 72 views
0

我正在学习Java 8,我看到一个与函数式编程有关的定义是“一个使用创建的程序只有纯函数,没有副作用允许”。函数式编程中的副作用是什么?

其中一个副作用是“就地修改数据结构”。

我不明白这一行,因为最后一些我们需要与数据库对话来存储或检索或更新数据。

修改数据库不起作用意味着我们如何在函数式编程中与数据库交谈?

+0

查找IO Monad。 – Enigmativity

+0

在Java 8的上下文中,你没有。如果这有利于并且诉诸其他编程风格,则以功能方式表达操作。 – Holger

回答

1

“就地修改数据结构结构”意味着您直接操作输入数据结构(即列表)。 “纯函数”的意思是

  • 结果是只有一函数的输入,而不是某些其他隐藏状态
  • 功能可以在相同的输入产生相同的结果被应用多次。它不会改变输入。

在面向对象编程中,您定义了对象的行为。行为可以是提供对对象状态的读取权限,对它的写入权限,或者两者兼有。在结合不同顾虑的操作时,可能会引入副作用。

例如一个堆栈和它的pop()操作。它会为每个调用产生不同的结果,因为它会改变堆栈的状态。

在函数式编程中,您可以将函数应用于不可变的值。函数表示数据流,而不是状态变化。所以函数本身是无状态的。并且函数的结果是原始输入或与输入不同的值,但从不是修改的输入。

OO也知道函数,但在所有情况下都不是,例如排序:在非函数式编程中,重新排列原始数据结构中的列表元素(“in-place”)。在Java中,这就是Collections.sort()所做的。

在函数式编程中,您可以对输入值(List)应用排序函数,从而生成具有排序值的新值(新列表)。函数本身没有状态,输入的状态也没有被修改。

所以一概而论:给定相同的输入值,将函数应用于该值产生相同的结果值

关于数据库操作。数据库本身的内容表示一个状态,它是所有存储值,表等的组合(“快照”)。当然你可以对这个数据应用一个函数来产生新的数据。通常情况下,您将操作结果存储回数据库,从而改变整个系统的状态,但这并不意味着您改变了函数的状态,也不改变它的输入数据。再次重新应用该函数不会违反纯函数约束,因为您将数据应用于新的输入数据。但是将整个系统视为“数据结构”将违反约束,因为函数应用程序会更改“输入”的状态。

所以整个数据库系统几乎被认为是功能,当然你也可以在一个功能性的方式对数据操作。

但是Java允许您同时执行两种操作(OO和FP),甚至可以混合使用两种模式,因此您可以选择最适合您需求的方法。

,或者从this answer

报价如果您有多个需要混合,混合您的范例。请勿将 限制为仅使用 工具箱的右下角。

相关问题