Java 标准库是否有任何具有功能更新的功能数据结构,例如不可变 Sets、Lists 等?
10 回答
函数式 java有Sets、Lists和更多有趣的抽象。
看看pcollections项目:
PCollections 充当 Java 集合框架的持久且不可变的类似物。这包括高效的、线程安全的、通用的、不可变的和持久的堆栈、映射、向量、集合和包,与它们的 Java 集合对应物兼容。
持久性和不可变数据类型作为可变数据类型的简单、设计友好、并发友好,有时更节省时间和空间的替代方案越来越受到人们的重视。
看到 Google Collections 被插入总是很高兴,但不,我们没有这个。我不知道有任何 Java 库可以做到。在 Google 内部,我们实现了一些功能性的 List 结构,你猜怎么着?没有人使用它们。因此,它们不太可能很快成为开源的。
听起来您正在寻找Scala。它编译为 .class,所以这就足够了,对吧?
你不需要斯卡拉。只需将您的收藏传递到:
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 问题中看到了这一点:
谷歌的不可变集
来自文档:
与 Collections.unmodifiableSet(java.util.Set) 不同,后者是仍然可以更改的单独集合的视图,此类的实例包含其自己的私有数据并且永远不会更改。此类对于公共静态最终集(“常量集”)很方便,还可以让您轻松制作调用者提供给您的类的集合的“防御性副本”。
编辑以合并评论。
嗯,有两种可能的方法来“改变”一个不可变的集合:
制作包含“更改”的副本
创建一个新的、不同的对象,该对象由对原始对象的引用和对更改描述的引用组成。
Clojure 采用后一种方法,因此可以相当快地创建原始集合的许多同级,并对每个同级进行少量更正,并具有合理的内存需求。但是大多数 Java 代码倾向于选择第一个选项。
值得一提的是,Google 已经创建了一些支持函数式编程的集合:http ://code.google.com/p/google-collections/但我没有深入研究它们。
我知道这是一个老问题,但搜索了一下告诉我,现在我们有了函数式 Java 的替代方案。
JavasLang看起来像是一个有趣的库,用于 Java 中的声明式编程和函数式数据结构。
在易用性和性能方面,我没有将它与函数式 Java 进行比较,但我很想得到任何关于这方面的建议。
字符串和数字在功能上是不可变的,但大多数集合不是(不可变集合在添加、删除等时抛出异常)。 CopyOnWriteArrayList
并且CopyOnWriteArraySet
在这个意义上是最接近的。
如果您对函数式风格的集合操作感兴趣,请查看lambdaj
看看谷歌收藏。