JVM的功能/不可变数据结构?

Pie*_*ste 16 java jvm functional-programming data-structures

有没有人知道Java/JVM数据结构库提供熟悉的Java数据结构的功能(也就是功能意义上的不可变或"持久")等价物?

"功能"是指对象本身是不可变的,而对这些对象的修改则返回与父对象在适当位置共享相同内部的新对象(为了提高时间和空间的效率;一个天真的实现可以复制整个事物每一次写).

就像Java的并发库一样,这似乎不是我能够或应该自己实现的东西,所以拥有一个我可以在JVM中使用的功能数据结构库会更好.

Abh*_*kar 13

Clojure的不可变和持久数据结构已被提取为Java库.您可以在http://github.com/krukow/clj-ds找到它们.这些数据结构不依赖于Clojure运行时,因此可以clojure.jar在应用程序的类路径中使用.他们已经通过Java代码顺利运行.

请注意,使用这些不可变数据结构可能不是Java中的惯用语.

github页面没有可供下载的jar.您必须自己检查源并构建jar.


Ber*_*ard 6

Functional和immutable是大多数Scala集合库的核心属性.Scala编译到JVM并与Java很好地互操作.Scala语法也比Clojure(Lisp语法)更接近Java.

这是Scala集合API的介绍页面. http://www.scala-lang.org/docu/files/collections-api/collections.html


Bol*_*olo 6

尝试使用Functional Java.它包含不可变的地图,集,列表和树.但是,这个库不仅仅是一组不可变数据结构!


nan*_*nda 3

尝试使用Guava,它有不可变的映射、列表、集合。它还具有一些支持不可变集合的实用程序,这些实用程序不是修改底层对象,而是返回一个新对象。

  • Guava 非常出色,但它的不可变数据结构不是“功能性的”:变异操作会抛出“UnsupportedOperationException”,而不是以某种方式返回更新的副本。后者需要完全不同的 API。请注意,这并不是对 Guava 的批评;而是对 Guava 的批评。开发人员只是认为 API 与标准 Java 集合的兼容性比支持函数式习惯更重要。 (3认同)