是否有Java版本的Clojure或Scala的持久化不可变向量?

6
也就是说,这是一个不可变的数据结构,但它可以通过 O(1) 索引实现数据共享。

请参见https://dev59.com/6Woy5IYBdhLWcg3wZtNC。 - om-nom-nom
4个回答

8

Karl Krukow将Clojure数据结构提取到独立库中,因此您可以在项目中使用它,而无需引入整个Clojure。还有pcollections,其中包含TreePVector实现(具有对数时间查找)。


3
我曾经在几年前为Java制作了一个持久数据结构库,也许可以满足您的需求:

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

它们有点像Clojure数据结构,但更适合Java:

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

我经常使用它们(每当我不想拉入整个Clojure时...),并将代码作为开源维护。我认为还有一些其他人在使用它们。基本上,它们处于稳定和可用的状态。 - mikera

1
请记住,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的易用性受到了影响。 - Duncan McGregor
我很好奇。你的使用场景是什么? - leonardoborges
在使用Scala一年后,没有默认的Scala集合确实有些痛苦!Guava可以帮助使用一些函数式构造,但是与Vector相比,它的不可变集合较差。 - Duncan McGregor

0

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