【问题标题】:java: libraries for immutable functional-style data structures [closed]java:用于不可变函数式数据结构的库
【发布时间】:2010-06-11 17:57:06
【问题描述】:

这与另一个问题 (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 在这方面失败了。

有什么建议吗?

【问题讨论】:

标签: java data-structures functional-programming


【解决方案1】:

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

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

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

Clojure - 尽管我很喜欢 Clojure,但在这种特殊情况下很难推荐它,因为 Java 开发人员的语法和陡峭的学习曲线完全不同。

【讨论】:

  • 谢谢。并不是我对他们中的任何一个都不满意,只是我对他们不熟悉,不幸的是我没有太多时间自己做出明智的决定(因此提出了这个问题)。一般来说,我不介意学习一门新语言,但它对任何维护/审查我的代码的人施加了限制。我想我也倾向于 Scala。我的书架上有“用 Scala 编程”,只是我似乎永远无法正确使用它的语法。
  • @Jason S:我认为投资 Scala 是值得的。它是一门很棒的语言。
【解决方案2】:

也许 Google 的 guava-libraries 可能会有一些用处: https://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained

【讨论】:

    【解决方案3】:

    斯卡拉

    你可以从另一种语言的方法中调用任何一种语言的方法

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

    【讨论】:

      【解决方案4】:

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

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        相关资源
        最近更新 更多