我刚开始学习Java 8,我看到了一个与函数式编程有关的定义,那就是“使用创建的程序只使用纯函数,无副作用允许”。
副作用之一是“修改适当的数据结构”。
我不明白这一行,因为最后一些地方我们需要与数据库交谈,以存储、检索或更新数据。
修改数据库不是功能,意味着如何在函数式编程中与数据库对话?
发布于 2016-04-25 09:16:36
“原位修改数据结构”意味着直接操作输入数据结构(即列表)。“纯函数”是指
在面向对象编程中,定义对象的行为。行为可以是提供对对象状态的读访问、对对象的写入访问,或者两者兼而有之。当组合不同关注点的操作时,您可能会引入副作用。
例如,一个堆栈,它是pop()操作。它将为每个调用产生不同的结果,因为它改变了堆栈的状态。
在函数式程式设计中,您会将函式应用于不变的值。函数表示数据流,而不是状态的变化。所以函数本身是无状态的。函数的结果要么是原始输入,要么是与输入不同的值,而不是修改后的输入。
OO也知道函数,但并不是所有情况下都是纯函数,例如排序:在非函数式编程中,可以在原始数据结构(“就地”)中重新排列列表中的元素。在Java中,这就是Collections.sort()`所做的。
在函数式编程中,您将对输入值(列表)应用排序函数,从而生成一个具有排序值的新值(新列表)。函数本身没有状态,输入的状态也没有修改。
因此,要泛化:给定相同的输入值,将函数应用于此值将产生相同的结果值。
关于数据库操作。数据库本身的内容表示一种状态,它是所有存储的值、表等的组合(“快照”)。当然,您可以将一个函数应用于生成新数据的数据。通常,您将操作结果存储回db,从而更改整个系统的状态,但这并不意味着您更改了函数的状态或它的输入数据。再次应用该函数并不违反纯函数约束,因为您将数据应用于新的输入数据。但是将整个系统视为“数据结构”将违反约束,因为函数应用程序会更改“输入”的状态。
因此,整个数据库系统很难被认为是功能性的,但当然您可以以一种功能的方式对数据进行操作。
但是Java允许您同时执行这两种方法(OO和FP),甚至可以混合这两种范式,因此您可以选择最适合您需要的方法。
或者引用this answer的话
如果你有多种需求混合在一起,混合你的范例。不要限制自己只使用工具箱的右下角。
https://stackoverflow.com/questions/36785264
复制相似问题