10

Java 标准库是否有任何具有功能更新的功能数据结构,例如不可变 Sets、Lists 等?

4

10 回答 10

15

函数式 javaSets、Lists和更多有趣的抽象。

于 2009-11-05T21:09:53.567 回答
2

看看pcollections项目:

PCollections 充当 Java 集合框架的持久且不可变的类似物。这包括高效的、线程安全的、通用的、不可变的和持久的堆栈、映射、向量、集合和包,与它们的 Java 集合对应物兼容。

持久性和不可变数据类型作为可变数据类型的简单、设计友好、并发友好,有时更节省时间和空间的替代方案越来越受到人们的重视。

于 2011-11-16T08:18:49.787 回答
1

看到 Google Collections 被插入总是很高兴,但不,我们没有这个。我不知道有任何 Java 库可以做到。在 Google 内部,我们实现了一些功能性的 List 结构,你猜怎么着?没有人使用它们。因此,它们不太可能很快成为开源的。

于 2009-11-05T22:48:19.380 回答
1

听起来您正在寻找Scala。它编译为 .class,所以这就足够了,对吧?

于 2009-11-05T20:41:51.377 回答
1

你不需要斯卡拉。只需将您的收藏传递到:

java.util.Collections.unmodifiableCollection(/* Collection<? extends T> c */);
java.util.Collections.unmodifiableSet(Set s);
java.util.Collections.unmodifiableMap(Map m);
java.util.Collections.unmodifiableList(List l);

我刚刚从另一个 SO 问题中看到了这一点:

谷歌的不可变集

http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

来自文档:

与 Collections.unmodifiableSet(java.util.Set) 不同,后者是仍然可以更改的单独集合的视图,此类的实例包含其自己的私有数据并且永远不会更改。此类对于公共静态最终集(“常量集”)很方便,还可以让您轻松制作调用者提供给您的类的集合的“防御性副本”。

编辑以合并评论。

于 2009-11-05T20:44:02.790 回答
1

嗯,有两种可能的方法来“改变”一个不可变的集合:

  • 制作包含“更改”的副本

  • 创建一个新的、不同的对象,该对象由对原始对象的引用和对更改描述的引用组成。

Clojure 采用后一种方法,因此可以相当快地创建原始集合的许多同级,并对每个同级进行少量更正,并具有合理的内存需求。但是大多数 Java 代码倾向于选择第一个选项。

值得一提的是,Google 已经创建了一些支持函数式编程的集合:http ://code.google.com/p/google-collections/但我没有深入研究它们。

于 2009-11-05T20:49:48.957 回答
1

我知道这是一个老问题,但搜索了一下告诉我,现在我们有了函数式 Java 的替代方案。

JavasLang看起来像是一个有趣的库,用于 Java 中的声明式编程和函数式数据结构。

在易用性和性能方面,我没有将它与函数式 Java 进行比较,但我很想得到任何关于这方面的建议。

于 2016-05-11T07:05:08.567 回答
0

字符串和数字在功能上是不可变的,但大多数集合不是(不可变集合在添加、删除等时抛出异常)。 CopyOnWriteArrayList并且CopyOnWriteArraySet在这个意义上是最接近的。

于 2009-11-05T20:52:40.980 回答
0

如果您对函数式风格的集合操作感兴趣,请查看lambdaj

于 2009-11-07T15:13:13.107 回答
-1

看看谷歌收藏

于 2009-11-05T20:52:13.587 回答