Function Java 是一个促进 Java 函数式编程的开源库。该库实现了许多基本和高级编程抽象,有助于面向组合的开发。函数式 Java 还可以作为学习函数式编程概念的平台,通过使用熟悉的语言介绍这些概念。
该库旨在用于生产应用程序,并使用基于规范的自动化测试技术以及 ScalaCheck 和Functional Java 的快速检查模块进行了彻底的测试。
函数式 Java 提供了以下类型的抽象:
基本数据结构 - 全部和部分函数、产品、单位、选项、无偏和右偏联合(或验证)、无效。
不可变集合 - 数组、列表、向量、流、集合、映射、优先级队列、手指树、异构列表、差异列表。
其他抽象 - 幺半群、半群、自然、随机数生成器、读取器、写入器、状态、输入/输出、解析器、拉链、基于规范的测试(快速检查)、参与者、光学(透镜、棱镜、折叠、遍历等)、并发和类型转换。
该项目的重要 URL 是:
网站,http://www.functionjava.org
网站存储库,http://github.com/functionjava/functionjava.github.io
Travis 持续集成构建,https://app.travis-ci.com/github/functionjava/functionjava
Sonatype 存储库,https://oss.sonatype.org/content/groups/public/org/functionjava/
Maven 中央存储库,https://mvnrepository.com/artifact/org.functionjava/functionjava
下载和使用该项目的推荐方法是通过构建工具。
使用org.functionaljava
组将功能性 Java 工件发布到 Maven Central,其中包含三个已发布的工件:
核心库( functionaljava
)
基于属性的测试( functionaljava-quickcheck
)
少量的 Java 8 支持( functionaljava-java-core
)
最新的稳定版本是5.0
。可以通过添加依赖项将其添加到您的 Gradle 项目中:
编译“org.functionjava:functionjava:5.0” 编译“org.functionjava:functionjava-quickcheck:5.0” 编译“org.functionjava:functionjava-java-core:5.0”
在 Maven 中:
<依赖关系> <groupId>org.functionjava</groupId> <artifactId>功能性java</artifactId> <版本>5.0</版本> </依赖> <依赖关系> <groupId>org.functionjava</groupId> <artifactId>功能性java-quickcheck</artifactId> <版本>5.0</版本> </依赖> <依赖关系> <groupId>org.functionjava</groupId> <artifactId>功能性java-java-core</artifactId> <版本>5.0</版本> </依赖>
构建是使用 Java 8 和 Gradle 7.4 完成的。在根目录运行:
./gradlew
这需要访问 Java 8,并将下载 Gradle 构建工具和必要的依赖项并构建FunctionalJava。
上述功能的更完整描述是:
基本数据结构
元数为 1 到 8 的函数 ( fj.F
)。
数量为 0 到 8 的函数可以产生异常 ( fj.Try
)。
参数数为 0 到 8 且返回 void ( fj.Effect
) 的函数。
参数数为 0 到 8 的函数返回 void 并可能引发异常 ( fj.TryEffect
)。
数量为 1 到 8 的产品 ( fj.P
)。
单位类型( fj.Unit
)。
可选值 -类型安全 null ( fj.data.Option
)。
不相交联合数据类型 -组合异常处理( fj.data.Either
)。
验证 -右偏组合异常处理( fj.data.Validation
)。
不可变集合
数组包装器( fj.data.Array
)。
不可变的内存中单链表 ( fj.data.List
)。
不可变的惰性单链表( fj.data.Stream
)。
一个包 ( fj.data.fingertrees
) 提供 2-3 个手指树用于持久序列的功能表示,支持在分摊 O(1) 时间内访问末端。
类型安全的异构列表( fj.data.hlist
),用于不同类型的元素列表,而不牺牲类型安全。
使用红/黑树( fj.data.Set
)实现不可变集。
不可变的多路树 - 又名玫瑰树( fj.data.Tree
)。
使用红/黑树实现的不可变树图( fj.data.TreeMap
)。
使用手指树的不可变优先级队列( fj.data.PriorityQueue
)。
差异列表,高性能列表。
其他抽象
幺半群( fj.Monoid
)。
半群( fj.Semigroup
)。
自然数数据类型( fj.data.Natural
)。
使用线性同余生成器( fj.LcgRng
) 的随机数生成器。
Reader、Writer 和 State monad( fj.data.Reader
、 fj.data.Writer
、 fj.data.State
)。
用于抽象 IO 的输入/输出 monad ( fj.IO
)。
Monadic 解析器组合器,用于通过使用组合来组合较小的解析器来编写解析器。
数据类型与标准 Java 类型之间的转换。
FunctionJava 和 Java 8 特定类型之间的转换。
HashMap 和 HashSet 的可配置相等性和哈希代码。
流和树的 Zipper 实现。
基于规范的自动化测试框架( fj.test
)。
用于并行计算( fj.control.parallel
)和分层抽象(例如并行映射、映射缩减、并行压缩)的完全可操作的 Actor。
用于更新不可变数据的光学器件,包括镜头、棱镜、iso、可选、遍历、getter、fold 和 setter。受到 Scala Monocle 库 (https://github.com/julien-truffaut/Monocle) 和 Haskell lens 库 (https://github.com/ekmett/lens) 的启发。
虚空,逻辑上无人居住的类型。
功能 Java 许可证使用 BSD 3 许可证(3 条款许可证),可从 https://en.wikipedia.org/wiki/BSD_licenses 获取。
有关每个版本的发行说明,请参阅目录链接:etc/release-notes。