【问题标题】:Is there a Java version of Clojure's or Scala's persistent immutable vector?是否有 Clojure 或 Scala 的持久不可变向量的 Java 版本?
【发布时间】:2013-04-06 13:16:27
【问题描述】:

也就是说,不可变但通过有效的 O(1) 索引共享数据。

【问题讨论】:

标签: java scala collections clojure immutability


【解决方案1】:

Karl Krukow 将 clojure 数据结构提取到 standalone library,因此您可以在不将整个 clojure 带入项目的情况下使用它。还有pcollections 具有TreePVector 实现(使用对数时间查找)。

【讨论】:

    【解决方案2】:

    几年前我为 Java 制作了一个持久性数据结构库,可能符合要求:

    https://github.com/mikera/mikera/tree/master/src/main/java/mikera/persistent

    它们有点像 Clojure 数据结构,但更多的是 Java 风格:

    • 充分利用泛型
    • 支持您期望的所有 Java 集合接口
    • 包括一些方便的特殊类型(例如,RepeatList 表示相同值的重复出现)

    【讨论】:

    • 我经常使用它们(每当我不想引入整个 Clojure 时...),并将代码保持为开源。我认为其他一些人正在使用它们。基本上,它们处于稳健且可用的状态。
    【解决方案3】:

    请记住,Clojure 最终只是 Java。因此,您可以将 Clojure 的 jar 放在您的类路径中并使用它的类。

    例如,Clojure 向量是clojure.lang.PersistentVector 的实例,映射是clojure.lang.PersistentArrayMap 的实例,列表是clojure.lang.PersistentList 的实例。

    我自己并没有在愤怒中尝试过,但如果我想在 Java 中使用持久性数据结构,我可能会采取这种方式。

    这样的事情可以让你开始:

    import clojure.lang.PersistentVector;
    ...
    ArrayList list = ...
    PersistentVector myVector = PersistentVector.create(list);
    // from here on, using myVector takes advantages of its persistent nature.
    

    显然,这些类是在考虑到 Clojure 的 API 的情况下构建的,而不是 Java 的易用性 - 但它肯定是可能的。

    【讨论】:

    • 谢谢,但这是一个重量级的解决方案,正如你所说,Java 的易用性受到了影响。
    • 我很好奇。你的用例是什么?
    • 在 Scala 中度过了一年,没有有效的默认 Scala 集合有点痛苦! Guava 有助于一些功能构造,但与 Vector 相比,它的不可变集合很差。
    【解决方案4】:

    这是一个 Scala -> Java 端口:https://github.com/andrewoma/dexx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-04
      • 2016-12-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2020-05-27
      相关资源
      最近更新 更多