功能java:what';这是什么?

功能java:what';这是什么?,java,types,functional-programming,monads,Java,Types,Functional Programming,Monads,我正在研究函数式Java,但我不明白什么是函数式Java。有人能解释和/或举个例子吗 (背景:我知道咖喱和闭包是什么)这是直接从谷歌代码项目中获取的: 关节联合类型(元组)是其他类型的产物。提供了1-8系列的产品(fj.P1-fj.P8)。当您想要从一个函数返回多个值,或者当您想要在实现只接受一个参数的接口方法时接受多个值时,这些函数非常有用。它们还可以用于获取其他数据类型的产品,例如列表(zip函数)。 //常规Java 公共整数albuquerqueToLA(地图){ Map m=Map.g

我正在研究函数式Java,但我不明白什么是函数式Java。有人能解释和/或举个例子吗


(背景:我知道咖喱和闭包是什么)

这是直接从谷歌代码项目中获取的:

关节联合类型(元组)是其他类型的产物。提供了1-8系列的产品(fj.P1-fj.P8)。当您想要从一个函数返回多个值,或者当您想要在实现只接受一个参数的接口方法时接受多个值时,这些函数非常有用。它们还可以用于获取其他数据类型的产品,例如列表(zip函数)。
//常规Java
公共整数albuquerqueToLA(地图){
Map m=Map.get(“阿尔伯克基”);
如果(m!=null)
返回m.get(“洛杉矶”);//可能返回null。
}
//具有产品和选项类型的功能性Java。
公共选项albuquerqueToLA(TreeMap()映射){
返回m.get(p(“阿尔伯克基”、“洛杉矶”);
}

P1
看起来像是一个简单的单元素。在Haskell中,它将被写为:

data P1 a = P1 a
(Haskell中的
Identity
类型)

也就是说,它是一个包含其他类型
a
的容器

这种类型还实现了最简单的monad,
Identity
,它允许将函数不透明地应用于框中的内容

在计算上,没有理由使用
标识
monad来代替简单得多的将函数应用于其参数的操作,但是,它在monad转换器堆栈的设计中很有用

身份monad的monad实现非常简单

return a     = P1 a
(P1 m) >>= k = k m
如您所见,这只是一个函数应用程序。

aha,:

因此,我可以使用返回
P1
的东西,而不是直接返回类型T,这很像Google Collections,并且只有在调用
P1.\u 1()
时,它才计算包含的值


(哈,这篇博文也很有趣……)

哦,它们是元组!我很困惑,p1javadoc列出了一个抽象方法,它把我弄糊涂了。等等:你为什么要麻烦使用P1?我明白你为什么要使用P2、P3等等。@Jason S:
p
方法内置于
p
类中。如果查看文档,它们重载了
p
方法以接受1-8个参数并返回相应的产品类型。他们可能确实导入了静态fj.P以避免使用
fj.P.P(…)
。这有点帮助,但我一点也不了解Haskell(或者monads),你可能需要阅读函数式编程的教程,才能真正理解它。在Java环境中,很难看到发生了什么。我想知道——有基于Java的吗?我的大脑已经很满了,+我不想学习Haskell,只是为了学习一些使用Java的新范例。
return a     = P1 a
(P1 m) >>= k = k m
>>> Also, P1 is potentially lazy. We use it for the implementation of
>>> Stream, for example.