Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming Java 8中函数式编程的对象引用透明性_Functional Programming_Java 8 - Fatal编程技术网

Functional programming Java 8中函数式编程的对象引用透明性

Functional programming Java 8中函数式编程的对象引用透明性,functional-programming,java-8,Functional Programming,Java 8,我一直在研究函数式编程,其中一个要求是,它们只返回计算值,不涉及任何其他内容或抛出异常,它们也不访问共享的可变对象,这使它们本质上是线程安全的 那么,实现将对象作为参数而不是原始值的纯函数的正确方法是什么呢。在传递给函数时,我是否需要深度克隆它们 理想情况下,对象应该是不可变的。不变性和函数式编程密切相关 如果拥有所有不可变对象是不可行的,那么理想情况下,您需要对所有对象进行深度复制,以确保对它们的更改不会影响函数之外的任何其他内容 理想情况下,对象应该是不可变的。不变性和函数式编程密切相关 如

我一直在研究函数式编程,其中一个要求是,它们只返回计算值,不涉及任何其他内容或抛出异常,它们也不访问共享的可变对象,这使它们本质上是线程安全的


那么,实现将对象作为参数而不是原始值的纯函数的正确方法是什么呢。在传递给函数时,我是否需要深度克隆它们

理想情况下,对象应该是不可变的。不变性和函数式编程密切相关


如果拥有所有不可变对象是不可行的,那么理想情况下,您需要对所有对象进行深度复制,以确保对它们的更改不会影响函数之外的任何其他内容

理想情况下,对象应该是不可变的。不变性和函数式编程密切相关


如果拥有所有不可变对象是不可行的,那么理想情况下,您需要对所有对象进行深度复制,以确保对它们的更改不会影响函数之外的任何其他内容

如果函数是纯函数,即不修改现有对象,无论它们是作为参数传递的还是位于其他地方,复制或克隆参数对象都没有意义

您也可以反过来看:如果需要克隆参数,则调用的代码不起作用,克隆参数不会将其转换为功能性代码,实际上是在解决设计缺陷

在最好的情况下,您将使用不可变对象,这会从本质上防止修改,但是,使用不可变对象不会改变函数代码的行为方式,它们只是强制执行函数代码的某些方面。当特定类不提供不可变对象时,您仍然可以以正确的方式使用它,而无需以不可变的方式重新实现它


通常,假设所有其他代码都会出现错误行为,并且解决错误行为问题是代码的任务,那么开发代码不是一个好主意。

如果函数是纯函数,即不修改现有对象,无论它们是作为参数传递的还是位于其他地方,复制或克隆参数对象毫无意义

您也可以反过来看:如果需要克隆参数,则调用的代码不起作用,克隆参数不会将其转换为功能性代码,实际上是在解决设计缺陷

在最好的情况下,您将使用不可变对象,这会从本质上防止修改,但是,使用不可变对象不会改变函数代码的行为方式,它们只是强制执行函数代码的某些方面。当特定类不提供不可变对象时,您仍然可以以正确的方式使用它,而无需以不可变的方式重新实现它


一般来说,假设所有其他代码都会出现错误行为,并且解决这些错误行为的问题是您的代码的任务,那么开发您的代码不是一个好主意。

您能给我指一下已经完成这种实现的任何材料吗?我只能找到使用基元类型的示例。或者我应该只限制我的案件原始types@jtkSource不可变的非原语类的示例?很抱歉,我只是好奇,如果对象是可变的(非原语),它是如何实现的,或者我应该重新考虑在这种情况下是否应该使用函数范式?@jtkSource没关系,我只是不确定你的问题是什么。你是在问深度复制可变对象的例子,还是创建不可变对象的例子?@jtkSource如果你选择的是纯功能的方法,是的,我会说将可变对象传递给函数是一个糟糕的设计选择,因为你允许副作用进入和离开函数。虽然iirc很难进行深度克隆。Java有一个可克隆的接口,但同样,iirc,它被认为是坏的。老实说,如果您想在JVM上进行函数式编程,请查阅Clojure。它是一种编译成Java字节码(或JavaScript)的函数式语言。一切(几乎)都是不可改变的,所以这个问题就不成问题了。你能给我指一下做过这种实现的材料吗?我只能找到使用基元类型的示例。或者我应该只限制我的案件原始types@jtkSource不可变的非原语类的示例?很抱歉,我只是好奇,如果对象是可变的(非原语),它是如何实现的,或者我应该重新考虑在这种情况下是否应该使用函数范式?@jtkSource没关系,我只是不确定你的问题是什么。你是在问深度复制可变对象的例子,还是创建不可变对象的例子?@jtkSource如果你选择的是纯功能的方法,是的,我会说将可变对象传递给函数是一个糟糕的设计选择,因为你允许副作用进入和离开函数。虽然iirc很难进行深度克隆。Java有一个可克隆的接口,但同样,iirc,它被认为是坏的。老实说,如果您想在JVM上进行函数式编程,请查阅Clojure。它是一种编译成Java字节码(或JavaScript)的函数式语言。一切(几乎)都是不可变的,所以这个问题就不成问题了。只要你不想让对象看起来不一样,你就不需要克隆任何东西。在做某件事之前,你不需要克隆任何东西。相反,您应该决定何时创建新实例或返回其中一个参数。例如,返回有关销售的统计数据。您有一个函数,该函数接收销售列表,并返回一个包含统计信息的对象(即总计、平均值、最小值、最大值等)。你为什么要深度克隆销售列表?只要你不想要这些对象