有什么适用于Java的良好持久集合框架?

35

所谓持久化集合是指像clojure中的那些集合。

举个例子,我有一个列表,元素为(a,b,c)。 对于普通列表,如果我添加d,那么原始列表将具有元素(a,b,c,d)。 对于持久化列表,当我调用list.add(d)时,我会得到一个新列表,其中包含(a,b,c,d)。 但是,实现尽可能在列表之间共享元素,因此它比仅返回原始列表的副本更节省内存。 它还有不可变性的优点(如果我持有对原始列表的引用,则它始终会返回原始3个元素)。

这些都可以在其他地方更好地解释(例如,http://en.wikipedia.org/wiki/Persistent_data_structure)。

总之,我的问题是......提供此功能以在Java中使用的最佳库是什么? 我是否可以以某种方式使用clojure集合(而不是直接使用clojure)?


2
你是说像Java中的LinkedList吗?我现在明白你的意思了,可以看看http://functionaljava.org/,或许能帮到你。 - Matt
你知道functionaljava.org中是否实现了我上面提到的那种结构吗?(我知道这有点无礼,否则我会去查看源代码的) - bm212
关于我之前的评论 - 是的,它可以实现,但如果可能的话,我更愿意使用Clojure的(因为我知道它们经过了实战考验)。 - bm212
13个回答

1

我很惊讶没有人提到vavr。我现在已经使用它很长时间了。

http://www.vavr.io

他们网站上的描述:

Vavr核心是Java的一个函数库。它有助于减少代码量并提高鲁棒性。向函数式编程迈出的第一步是开始思考不变的值。Vavr提供了不可变集合以及必要的函数和控制结构来操作这些值。结果很美丽,而且非常实用。


1

totallylazy是一个非常好的函数式编程库,其中包括以下实现:

  • PersistentList<T>:具体实现有LinkedList<T>TreeList<T>(用于随机访问)
  • PersistentMap<K, V>:具体实现有HashTreeMap<K, V>ListMap<K, V>
  • PersistentSortedMap<K, V>
  • PersistentSet<T>:具体实现为TreeSet<T>

使用示例:

import static com.googlecode.totallylazy.collections.PersistentList.constructors.*;
import com.googlecode.totallylazy.collections.PersistentList;
import com.googlecode.totallylazy.numbers.Numbers;

...

PersistentList<Integer> list = list(1, 2, 3);

// Create a new list with 0 prepended
list = list.cons(0);

// Prints 0::1::2::3
System.out.println(list);

// Do some actions on this list (e.g. remove all even numbers)
list = list.filter(Numbers.odd);
// Prints 1::3
System.out.println(list);

totallylazy 在不断维护中,其主要缺点是完全没有 Javadoc。


1
另一个问题是它运行速度相当慢。例如,这个需要大约700-800毫秒才能运行。使用clj-ds进行类似的操作,即这个,只需要 ~9倍少(约85ms)。相比之下,Java的HashMap只需要 ~25ms。 - levant pied
@levantpied,你的示例中的num有多大? - Stefan Haberl
@StefanHaberl final int num = 100000; => @StefanHaberl final int num = 100000; - levant pied

0

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