这是学习Java8 新特性之一 Lambda 公式时所做的笔记,尝试从它的意义、作用、使用、不足四个方面进行解析,未尽之处请多包涵。
意义
Lambda表达式的意义:
对程序员来说最直观的感受就是用Lambda表达式可以简化很多代码。使用它可以很轻松的将很多行代码缩减成一行。
而更大的意义是,Lambda表达式对java性能的提升[1]。
作用
需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
如果你仔细观察自己的代码,会发现这种场景其实很常见:你在某处就真的只需要一个能做一件事情的函数而已,连它叫什么名字都无关紧要。Lambda 表达式就可以用来做这件事。
使用
1.推导[3]
Lambda表达式可以看成是匿名类一点点演变过来,以下例子方法内容不要纠结,主要看形式是如何变化。
1. 匿名类的正常写法
HeroCheckerc1 = new HeroChecker() {
public boolean test(Hero h) {
return (h.hp>100 &&h.damage<50);
}
};
2. 把外面的壳子去掉
只保留方法参数和方法体
参数和方法体之间加上符号 ->
HeroCheckerc2 = (Hero h) ->{
return h.hp>100 &&h.damage<50;
};
3. 把return和{}去掉
HeroCheckerc3 = (Hero h) ->h.hp>100 && h.damage<50;
4. 把 参数类型和圆括号去掉(只有一个参数的时候,才可以去掉圆括号)
HeroCheckerc4 = h ->h.hp>100 && h.damage<50;
5. 把c4作为参数传递进去
filter(heros,c4);
6. 直接把表达式传递进去
filter(heros,h -> h.hp > 100 && h.damage < 50);
PS:与匿名类 概念相比较,Lambda 其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。
2.具体使用[3]
1.方法引用
1: 引用静态方法
2 : 引用对象方法
3 : 引用容器中的对象的方法
4 : 引用构造器
2.聚合操作
聚合操作方式遍历数据
PS:由于牵涉到Stream和管道的概念,在此不详细展开[4]。
不足[3]
Lambda表达式虽然带来了代码的简洁,但是也有其局限性。
1. 可读性差,与啰嗦的但是清晰的匿名类代码结构比较起来,Lambda表达式一旦变得比较长,就难以理解
2. 不便于调试,很难在Lambda表达式中增加调试信息,比如日志
3. 版本支持,Lambda表达式在JDK8版本中才开始支持,如果系统使用的是以前的版本,考虑系统的稳定性等原因,而不愿意升级,那么就无法使用。
Lambda比较适合用在简短的业务代码中,并不适合用在复杂的系统中,会加大维护成本。
参考网页:
[1] http://www.jianshu.com/p/f02b04344365Lambda表达式的意义
[2] https://www.zhihu.com/question/20125256 Lambda 表达式有何用处?如何使用?
[3] http://how2j.cn/k/lambda/lambda-lamdba-tutorials/697.htmlJAVA 中级 / LAMBDA / JAVA LAMBDA 表达式教程
[4] http://how2j.cn/k/lambda/lambda-stream/700.htmlJAVA 中级 / LAMBDA / JAVA 集合的聚合操作
时间:2017年5月24日22:28:01