Java中的函数式编程

60

有没有适用于Java的函数式编程库?

我正在寻找像PredicateList.Find()(作为静态方法)等内容。这些实现并不复杂,但在这里找到可重用的库将是很好的。

12个回答

44

FunctionalJava是最知名的Java库之一,它利用Java闭包(BGGA)进行编程示例:

final Array<Integer> a = array(1, 2, 3);  
final Array<Integer> b = a.map({int i => i + 42});  
arrayShow(intShow).println(b); // {43,44,45}  

编辑

还可以查看lambdaj.

进一步编辑

BGGA是完全可选的。它只是为了更好的语法。


5
但是 BGGA 并不实际运行在 Java 上,所以这个代码无法编译通过,对吗? - Gabe Moothart
9
BGGA可用作预编译器,将{int i => i + 42}翻译成new F <Integer,Integer>(){public Integer f(Integer i){return i + 42;}}。 后者可与任何旧版Java一起编译。 - Apocalisp
对,确实有点令人沮丧。 - dfa
此外,源代码易读且可嵌入。我能够在不使用完整库的情况下取出一些类并利用函数式Java。 - Berlin Brown

30

Scala是一种函数式编程语言,与Java完全兼容(通过JVM运行)。它提供了面向对象和函数式技术的完美结合,并在泛型和并发性方面比Java有许多改进。 甚至有人认为它可以取代Java。


27

Java库

有些库可以帮助您完成这个过程,通过为您完成所有工作并隐藏玄学事物:

成熟/已建立的库

更为晦涩/实验性的库

这些将允许您使用更具功能性且可能更熟悉FP能力语言中预期的语法和语义编写Java代码。在合理范围内,当然是这样。

JVM语言

显然,您可以在Java之上实现功能语言。因此,您可以将其作为FP语言使用。这比您所请求的抽象级别稍高,但相对而言,它仍然与上下文相关(尽管我在这里有点耍小聪明)。

例如,请查看:

相当成熟的语言

较不成熟或更为晦涩的语言

  • Frege:一种纯函数式编程语言,旨在提供类似 Haskell 的体验,并可在 Java 平台上运行。
  • Jaskell:另一种类似 Haskell 的语言,专注于在 JVM 上运行。

进一步阅读

您可能还想阅读或观看以下文章或视频:


摘自我的 P.SE 上对 "Java 中是否可能进行函数式编程?"的回答。


+1 优秀的“进一步阅读”链接!!! - djhaskin987

13

Google Collections 包含了不少函数式编程风格的常用实用方法。有一些关注点的类包括 Iterables、Iterators、Function、Functions 等。

它还有许多集合类!


3
图书馆现在已被 Guava 取代。 - thSoft

12

那么...哪一个呢? 对于我们中的懒人,它们可以在没有Java闭包的情况下使用吗?(假设我只想要一个库,而不是强制我使用不同的编译器的东西) - ripper234
2
Functional Java只是一个库,但如果你想使用BGGA闭包语法,它可以与之配合使用。 - Apocalisp

7
如果您想要一个纯Java解决方案,请查看lambdaj。

http://code.google.com/p/lambdaj/

除了可以在DSL风格中定义和使用闭包之外,它还允许以函数式的方式操作集合,而无需显式编写闭包或循环。

LambdaJ似乎比functionaljava更受欢迎。 - Berlin Brown

4

这里提到了Scala,但有一种更轻量级且更兼容Java的语言:Xtend。它编译成普通的Java,并使用相同的类型系统。它具有出色的Eclipse支持。您可以在单个项目中混合使用.java.xtend文件。

示例代码:

def static void main(String[] args) {
    val s = #[1,2,3].map[it+43].join(", ")
    println(s);
}

4

Apache Commons中有一些函数式的代码。例如,可以查看Predicate接口。


4

Jambda是另一个函数式编程库。从文档中可以看到:

Jambda试图向Java(TM)世界提供函数式编程(FP)的工具和概念。

目标有几个:

  • 为Java程序员提供表达力强大的FP构造
  • 为Java程序员提供进入FP世界的桥梁
  • 看看Java和泛型能走多远

本文旨在介绍Java程序员进入FP世界,并同时解释一些Jambda的功能。


4

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