这与另一个问题(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在这方面失败。
有什么建议吗?
答案 0 :(得分:6)
在我看来,你已经知道你的选择是什么,你只是对它们中的任何一个都不满意。以下是我对您提供的三个选项的看法:
功能性Java - 这个似乎最适合您。除了您不喜欢文档之外,它符合您的所有要求。从我的角度来看,文档看起来很基本,但是可以使用。他们的code snippets应该让你快速上手。学习曲线似乎几乎不存在,这应该有助于减少文档的缺乏。仅供参考,核心Java TreeMap也基于红黑树。
Scala - 如果我在你的鞋子里,我会选择这个。您似乎不想学习新语言,但Scala是一个非常容易从Java过渡的过程。你可以先编写非常类似于java的代码,然后慢慢采用更多功能的习惯用法。 Java< - > Scala interop在两个方向都很出色。
Clojure - 尽管我喜欢Clojure,但由于java开发人员的语法和学习曲线截然不同,因此很难在这个特定实例中推荐。
答案 1 :(得分:1)
答案 2 :(得分:0)
答案 3 :(得分:0)
我花了一些时间使Clojure持久/不可变数据结构在Java中工作,合理的构造函数和泛型作为Pure4J的一部分。
这还包括@ImmutableValue
类,用于确保集合不仅是不可变的,而且放在它们中的值也是不可变的。
希望这有帮助。