Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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
Java中的函数数据结构_Java_Functional Programming_Set_Immutability - Fatal编程技术网

Java中的函数数据结构

Java中的函数数据结构,java,functional-programming,set,immutability,Java,Functional Programming,Set,Immutability,Java标准库是否有任何功能性数据结构,如不可变集、列表等,以及功能性更新?听起来像是您在寻找的。它编译为.class,所以这就足够了,对吗?您不需要scala。只需将您的收藏传递到: java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */); java.util.Collections.unmodifiableSet(Set s); java.util.Collections.unmo

Java标准库是否有任何功能性数据结构,如不可变集、列表等,以及功能性更新?

听起来像是您在寻找的。它编译为.class,所以这就足够了,对吗?

您不需要scala。只需将您的收藏传递到:

java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */);
java.util.Collections.unmodifiableSet(Set s);
java.util.Collections.unmodifiableMap(Map m);
java.util.Collections.unmodifiableList(List l);

java.util.Collections.unmodifiableCollection(/*Collection嗯,有两种可能的方法可以“更改”不可变的集合:

  • 制作一份包含“变更”的副本

  • 创建一个新的、不同的对象,该对象由对原始对象的引用和对更改描述的引用组成

Clojure采用了后一种方法,因此创建一个原始集合的许多同级会变得相当快,每个同级都有少量的修改,并且内存需求合理


值得一提的是,Google已经创建了一些支持函数式编程的集合:但我还没有深入研究它们。

看看。

字符串和数字在功能上是不可变的,但大多数集合不是(不可变集合在添加、删除等时会抛出异常)。从这个意义上说,它们是最接近的。

有更多有趣的抽象。

看到Google Collections插件总是很好,但不,我们没有。我不知道有任何Java库有。在Google内部,我们实现了一些功能列表结构,猜猜看,没有人使用它们。因此,它们不太可能成为随时开放源代码。

如果您对功能性风格的集合操作感兴趣,请查看项目:

PCollections充当Java Collections框架的持久性和不可变的类似物。这包括高效的、线程安全的、通用的、不可变的和持久性的堆栈、映射、向量、集合和包,它们与Java Collections的对应物兼容

持久和不变的数据类型作为一种简单、设计友好、并发友好、有时比可变数据类型更节省时间和空间的替代品越来越受到人们的青睐


我知道这是一个老问题,但仔细研究一下,我发现现在我们有了一个功能性Java的替代方案

看起来像是Java中声明式编程和函数式数据结构的有趣库


在易用性和性能方面,我没有将它与函数式Java进行比较,但我很想在这方面得到任何指导。

hmm也许吧。只是我们在一个功能性的课程中得到了一些支持代码(即,向结构中添加一些东西会返回一个新版本,并进行更新),但它是通过总是复制旧结构并添加新的内容来编写的。这让我很难过。我想知道是否有一种更简单、更好的方法,但我想Java只是让它变得更难。+1:你更快了=)顺便说一句,还有
不可修改列表()
不可修改映射()
,在
java.util.Collections
API中有更多可用的方法:我想向集合中添加一些东西,保持旧集合不变,然后返回一个新集合。我不认为不可修改集给了我这个吗?@Claudiu是的,不可修改集肯定不会那样做。不可修改和不可修改不是一回事。尝试对不可修改的集合进行变异将导致RuntimeException,而对于不可变集合,则根本不可能进行这种变异,因此可以保证代码不会在运行时崩溃。(如果您不明白我的意思,请查看
fj.data.List
的源代码。)您想要列表中所有对象的深度副本,还是只需要一个函数,为您提供指向与源相同对象的指针的新列表?我想要一个集合的持久数据结构,而不是以愚蠢的方式实现。例如,不可变列表可以通过将所有元素复制到新列表并添加元素-O(n)来实现添加。或者它可以是一个链表,将元素添加到head,然后返回head-O(1)。在Java中没有“深度复制”任何内容的通用方法。