java:用于不可变函数式数据结构的库

标签 java data-structures functional-programming

<分区>

这与另一个问题 (Functional Data Structures in Java) 非常相似,但那里的答案并不是特别有用。

我需要使用标准 Java 集合的不可变版本(例如 HashMap/TreeMap/ArrayList/LinkedList/HashSet/TreeSet)。 “不可变”是指功能意义上的不可变(例如 purely functional data structures ),其中对数据结构的更新操作不会更改原始数据,而是返回同类数据结构的新实例。此外,数据结构的新旧实例通常也会共享不可变数据,以提高时间和空间效率。

据我所知,我的选择包括:

但我不确定这些是否对我特别有吸引力。我有一些要求/愿望:

  • 有问题的集合应该可以直接在 Java 中使用(类路径中有适当的库)。 FJ 会为我工作;我不确定我是否可以在 Java 中使用 Scala 或 Clojure 的数据结构,而不必使用这些语言的编译器/解释器,也不必编写 Scala 或 Clojure 代码。

  • 列表/映射/集合的核心操作应该是可能的,而不必创建语法困惑的函数对象(FJ 看起来有点不确定)

  • 它们在时间和空间上应该是高效的。我正在寻找一个理想情况下已经完成一些性能测试的库。 FJ的TreeMap是基于红黑树的,不知道怎么评价。

  • 文档/教程应该足够好,以便有人可以快速开始使用数据结构。FJ 在这方面失败了。

有什么建议吗?

最佳答案

在我看来,您似乎已经知道自己的选择是什么,只是对其中任何一个都不满意。以下是我对您提供的三个选项的看法:

Functional Java - 这个似乎最适合您。除了您不喜欢文档外,它符合您的所有要求。从我的角度来看,文档看起来很基础,但很有用。他们的code snippets应该让你快速启动并运行。学习曲线似乎几乎不存在,这应该有助于缓解文档不足的问题。仅供引用,核心 Java 的 TreeMap同样基于红黑树。

Scala - 如果我处在您的位置,这就是我会做出的选择。你似乎不想学习一门新语言,但 Scala 是从 Java 非常容易的过渡。您可以一开始编写非常像 java 的代码,然后慢慢采用更多功能性的习语。 Java <-> Scala 互操作在两个方向上也都非常出色。

Clojure - 尽管我非常喜欢 Clojure,但由于完全不同的语法和 Java 开发人员的陡峭学习曲线,很难在这个特定实例中推荐它。

关于java:用于不可变函数式数据结构的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3025064/

相关文章:

java - 是否可以使用 javascript 书签来调用本地存储/本地托管的 Java 小程序?

java - 为什么我不能返回数组的值?

Clojure 头部保留

c++ - 构造函数初始化列表中可变参数的 Lambda 捕获

Java Android Date 周五返回错​​误的 GetDay()

java - 我可以用什么来在 Java 中设置 cookie?

algorithm - 按排序顺序列出 B 树中的键所需的时间?

java - 是否有允许间隙的列表实现?

java - 我可以使用什么数据结构来计算国家代码的出现次数?

functional-programming - 定义共域子集的函数