如何在Groovy中为函数/方法创建函数管道?

如何在Groovy中为函数/方法创建函数管道?,groovy,functional-programming,Groovy,Functional Programming,我想创建管道来连接Groovy函数(方法)调用,就像它在其他函数语言(如F#)中所做的那样: 让我们打印消息= 打印“%s”消息 //“Hello World”将作为参数传递给打印函数 “你好,世界”|>打印 有一个使用或运算符的简单实现: Object.metaClass.or{it->it(委托)} def print={msg-> 普林顿味精 } “你好世界”|打印//你好世界 但它仅适用于具有1个参数的函数。对于更多参数,必须使用rcurry: Object.metaClass.or

我想创建管道来连接Groovy函数(方法)调用,就像它在其他函数语言(如F#)中所做的那样:

让我们打印消息=
打印“%s”消息
//“Hello World”将作为参数传递给打印函数
“你好,世界”|>打印
有一个使用
运算符的简单实现:

Object.metaClass.or{it->it(委托)}
def print={msg->
普林顿味精
}
“你好世界”|打印//你好世界
但它仅适用于具有1个参数的函数。对于更多参数,必须使用rcurry

Object.metaClass.or{it->it(委托)}
def print={msg1,msg2->
println msg1+msg2
}
“你好世界”| print.rcurry(“!!!”)//你好世界!!!
有没有办法摆脱
rcurry
方法,让Groovy代码更类似于F#?顺便说一句,这种简单的实现只适用于Groovy脚本文件。如何使它也适用于类文件


注意:还有其他方法,但这些都是关于shell命令而非函数的管道。

看起来您只需要使用
&
将方法转换为闭包,并使用
>
进行函数组合

public static String addExclamations(String s) { 
    return s + "!!!"
} 

Closure printUppercase = { String s -> println s.toUpperCase() }

"Hello World".with (this.&addExclamations >> printUppercase)
我发现自己一直在使用一个真实的例子:

import groovy.json.JsonOutput

[a:[b:'c', d:'e']].with (JsonOutput.&toJson >> JsonOutput.&prettyPrint)        

我不确定您对多参数的理解,因为各种
咖喱
解决方案对我来说似乎是明智的,但您已经忽略了这一点。。。如果你能给出一个你希望它看起来如何的例子,也许我可以编辑这个答案?

对你有帮助吗?@dilvan,这是什么原因?我喜欢用函数式编程,“管道”是Groovy唯一缺少的基本函数式。对于我们这些不懂F#的人来说,你能举例说明多参数的东西在F#中是什么样子的吗?
让sum3 x y z=x+y+z
被称为:
3 |>sum3 1 2
Nice语法。您知道如何使用Groovy扩展模块实现我的简单解决方案(使用or操作符)吗?