Java:不可变函数式数据结构的库

12

这与另一个问题非常相似 (Java中的函数式数据结构),但那里的答案并不特别有用。

我需要使用标准Java集合的不可变版本(例如HashMap / TreeMap / ArrayList / LinkedList / HashSet / TreeSet)。 通过“不可变”,我指的是函数式意义上的不可变(例如,纯函数数据结构),在该数据结构上更新操作不会更改原始数据,而是返回同一种数据结构的新实例。通常,数据结构的新旧实例将共享不可变数据以在时间和空间上高效利用。

从我所知道的情况来看,我的选择包括:

但我不确定这些是否特别适合我。 我有一些要求/期望:

  • 相关集合应该可以直接在Java中使用(使用类路径中的适当库)。FJ对我有用;我不确定是否可以在Java中使用Scala或Clojure数据结构而无需使用这些语言的编译器/解释器和编写Scala或Clojure代码。

  • 在不创建具有令人困惑的语法的函数对象的情况下,应该可以执行列表/映射/集合的核心操作(FJ看起来有点靠不住)

  • 它们应该在时间和空间上都很高效。我正在寻找一个最好进行了一些性能测试的库。FJ的TreeMap是基于红黑树的,不确定它的评级如何。

  • 文档/教程应该足够好,以便某人可以快速开始使用这些数据结构。 FJ 在这方面做得不够好。

  • 有什么建议吗?


    还有一个 https://github.com/blackdrag/pcollections - Beni Cherniavsky-Paskin
    4个回答

    6

    看起来你已经知道你的选择,只是对这些选择不太满意。以下是我对你提供的三个选择的看法:

    Functional Java - 这似乎是最适合你的选择。它符合你所有的要求,除了你不喜欢文档。从我的角度来看,文档看起来很基础,但足以使用。他们的代码片段可以让你快速上手。学习曲线几乎不存在,这应该有助于缓解文档的不足。FYI,核心Java的TreeMap也是基于红黑树的。

    Scala - 如果我处在你的位置,我会选择这个。你似乎不想学习一门新语言,但Scala是从Java过渡非常容易的语言。你可以一开始编写非常类似Java的代码,并逐步采用更多的函数式习惯用法。Java <-> Scala互操作性在两个方向上都非常出色。

    Clojure - 尽管我非常喜欢Clojure,但由于其与Java开发人员的语法截然不同和陡峭的学习曲线,很难在这种情况下推荐它。


    谢谢。并不是说我对它们不满意,只是我对它们不熟悉,而且很不幸,我没有太多时间自己做出明智的决定(因此提出了这个问题)。总的来说,我不介意学习一门新语言,但它会对任何维护/审查我的代码的人造成限制。我认为我也倾向于Scala;我在书架上有《Scala编程》这本书,只是我似乎从来就无法正确使用它的语法。 - Jason S
    @Jason S:我认为投资于Scala一定是值得的。它是一门很棒的语言。 - dbyrne

    1

    0

    0

    我花了一些时间让 Clojure 的持久化/不可变数据结构在 Java 中工作,并将合理的构造函数和泛型作为Pure4J的一部分。

    这也包括一个@ImmutableValue类,用于确保集合不仅是不可变的,而且其中放置的值也是不可变的。

    希望这可以帮助到你。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接