java:用于不可变功能样式数据结构的库

java: libraries for immutable functional-style data structures

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

我需要使用标准Java集合的不可变版本(例如HashMap / TreeMap / ArrayList / LinkedList / HashSet / TreeSet)。"不可变的"是指在功能意义上是不可变的(例如,纯功能数据结构),其中对数据结构的更新操作不会更改原始数据,而是返回相同类型数据结构的新实例。同样,通常,数据结构的新旧实例将共享不可变数据,以便在时间和空间上高效。

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

  • 功能性Java
  • scala
  • Clojure

但是我不确定其中任何一个是否对我特别有吸引力。我有一些要求/要求:

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

  • 在列表/地图/集合上的核心操作应该是可能的,而不必创建具有混淆语法的函数对象(FJ看起来有些虚假)

  • 它们应该在时空上高效。我正在寻找理想情况下已进行一些性能测试的库。 FJ的TreeMap基于一棵红黑树,不确定该如何评分。

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

有什么建议吗?


在我看来,您已经知道您的选择了,您对其中的任何一个都不满意。这是我对您提供的三种选择的看法:

功能性Java-这似乎最适合您。它符合您的所有要求,但您不喜欢该文档。从我的angular来看,该文档看起来很基础,但是可以使用。他们的代码片段应使您快速启动并运行。学习曲线似乎几乎不存在,这将有助于减轻文档的缺乏。仅供参考,核心Java的TreeMap也基于Red-Black树。

scala(Scala)-如果我穿着您的鞋子,这就是我的选择。您似乎不想学习一种新语言,但是Scala是从Java轻松过渡的一种。首先,您可以编写非常类似于Java的代码,然后慢慢采用更多功能惯用语。 Java <-> Scala互操作在两个方向上也都很出色。

Clojure-尽管我很喜欢Clojure,但由于Java开发人员的语法和学习曲线截然不同,因此在这种特殊情况下很难推荐。


也许谷歌的番石榴图书馆可能有一些用处:
https://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained


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

这还包括@ImmutableValue类,以确保不仅集合是不可变的,而且您放入集合中的值也是不可变的。

希望这会有所帮助。


scala

You can call the methods of either language from methods in the other one

http://www.scala-lang.org/faq/4