Java8之Lambda

这是学习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

原文地址:https://www.cnblogs.com/Sherlock-J/p/12926012.html