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

时间:2010-06-11 17:57:07

标签: 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在这方面失败。

有什么建议吗?

4 个答案:

答案 0 :(得分:6)

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

功能性Java - 这个似乎最适合您。除了您不喜欢文档之外,它符合您的所有要求。从我的角度来看,文档看起来很基本,但是可以使用。他们的code snippets应该让你快速上手。学习曲线似乎几乎不存在,这应该有助于减少文档的缺乏。仅供参考,核心Java TreeMap也基于红黑树。

Scala - 如果我在你的鞋子里,我会选择这个。您似乎不想学习新语言,但Scala是一个非常容易从Java过渡的过程。你可以先编写非常类似于java的代码,然后慢慢采用更多功能的习惯用法。 Java< - > Scala interop在两个方向都很出色。

Clojure - 尽管我喜欢Clojure,但由于java开发人员的语法和学习曲线截然不同,因此很难在这个特定实例中推荐。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

Scala的

  

您可以从另一个

中的方法调用任一种语言的方法

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

答案 3 :(得分:0)

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

这还包括@ImmutableValue类,用于确保集合不仅是不可变的,而且放在它们中的值也是不可变的。

希望这有帮助。