最近在学习Golang
的过程中,当看到闭包的应用的时候,突然感觉到一种非常熟悉的感觉。虽然我自己在写代码时候一般会避免使用闭包形式,主要是觉得语法太花哨,可读性比较差,还有一个原因就是我也不太熟。这次刚好趁着学习Golang,一起复习一下已经学过的语言的闭包应用中把方法当做参数的应用。再查完资料之后,发现其实还是有一些应用场景的,以后有机会我会多在工作中应用。
接下来分享Java、Groovy、Python和Golang中是如何把方法当做参数的。
Part1Java
Java是我最早接触的语言,用的也比较多,通过本次重新复习Java知识,我又学到了新知识。之前我以为Java在把闭包中都是java.util.function.Function
,后来我发现这个类只能通过一个参数和一个返回值。如果想多传参数或者不使用参数可以使用java.util.function.BiFunction
和java.util.function.Supplier
。
1定义方法闭包
单个参数:
Function<Integer, Integer> plus10 = f -> f * 10;
两个参数:
代码语言:javascript复制 BiFunction<Integer, Integer, Integer> pluss = (x, y) -> {
return x * y;
};
没有参数:
代码语言:javascript复制 Supplier<Integer> plu = () -> {
return getMark();
};
2方法中返回闭包和使用闭包
返回方法闭包:
代码语言:javascript复制 static Function<Integer, Integer> have(int i) {
return f -> f i;
}
把闭包当做参数:
代码语言:javascript复制 private static int funTestInt(int dir, Function<Integer, Integer> function) {
return function.apply(dir);
}
看得出来,Java还是比较严格的,不同的参数用的类都不一样,的确不如其他语言灵活。
Part2Groovy
Groovy语言大部分语法是Java兼容的,但是在闭包这个功能上,差别还是挺大的,个人感觉完全优于Java体验。Groovy在语法上非常灵活,有时候我得自己摸索一下才行,按照Java的写法也行,按照Groovy写法也行,有时候混着写也行。个人建议最好使用Groovy语法,避免万一以后升级导致不兼容。
3定义方法闭包
无参数:
def plussss = {return 10}
或者:
def plusss = () -> 10
单个参数:
def pluss = f -> f 10
或者:
def plussa = {f -> return f 10}
又或者:
def plussaa = {f -> f 10}
多个参数:
def plus = {x, y -> return x y * 2}
其他写法省略……
4方法中返回闭包和使用闭包
返回方法闭包:
代码语言:javascript复制 static Closure<Integer> plus3(int i) {
return {f -> return f * i}
}
把闭包当做参数:
代码语言:javascript复制 static int plus2(int i, Closure closure) {
return closure(i, 32)
}
Part3Python
好久不写Python了,部分语法我同样重新学了一遍,Python的闭包来说,直接定义闭包写法多个一个关键字Lambda
,方法中返回中有点难懂的,这一点跟Golang一样,写法有点类似定义新方法。还有一点Python弱类型的特性有点让应用中可能会遇到参数类型不确定导致的可读性问题,不知道Python最新版支持类型标注之后会不会好点,接下来我只做一些基础的实践。如有疏漏,望各位海涵。
5定义方法闭包
单个参数:
ff = lambda f: f 19
多个参数:
ss = lambda x, y: x * y 1
看得出来,Python还是挺简单的,这一点跟Groovy平分秋色。
6方法中返回闭包和使用闭包
返回方法闭包:
代码语言:javascript复制def test2(me):
def test3(name):
print me "方法"
print name
return test3
把闭包当做参数:
代码语言:javascript复制def testt(ff):
return ff(3)
Python语法还是有点不适应,只能练习到这种程度了。
Part4Golang
终于轮到Golang,最近在学习Golang基础,已经写了一个简单的HttpClient客户端,算是有点小成绩,下一步计划是用Golang重新测试一下Golang协程和Java线程在做性能测试对比。Golang的语法比较统一,既不像Java那样繁琐,也不像Groovy有太多灵活语法,跟上文中Python直接在方法中返回闭包的写法类似,而且在直接定义和方法中返回语法一致,而且是强一致性。
7定义方法闭包
ff:= func(f int) int{return f * 11}
多个参数方法省略……
8方法中返回闭包和使用闭包
返回方法闭包:
代码语言:javascript复制func out() func(int) int {
return func(y int) int {
return y 21
}
}
把闭包当做参数:
代码语言:javascript复制func FunMethod(i int, f func(int) int) {
f(i * 3)
}
PS:其实除了Java不同参数数量和类型需要额外定义使用不同的类以外,其他语法都可以规避掉这一点。在自定义闭包和方法中闭包使用,语法都是通用的。这里也体现出来非静态语言的灵活性。