摘要:的表达式的一个大亮点是引入表达式,使用它设计的代码会更加简洁。表达式其实是一个匿名函数。匿名方法的写法定义一个接口,接口的方法是判断是否满足的条件。
Java8的Lambda 表达式
Java 8的一个大亮点是引入Lambda表达式,使用它设计的代码会更加简洁。Lambda 表达式其实是一个匿名函数。
一、演变过程
1.普通方法的写法
定义一个Hero对象,存储英雄的属性 public class Hero implements Comparable{ /** * 英雄名 */ public String name; /** * 血量 */ public float hp; /** * 伤害 */ public int damage.......
筛选出,满足下面条件的英雄类
private static void filter(Listheros) { for (Hero hero : heros) { if (hero.hp > 100 && hero.damage < 50) System.out.print(hero); } }
这种方式,如果筛选条件改变,需要重新再写一个方法,稍微麻烦一点。
2.匿名方法的写法
定义一个接口,接口的方法是判断是否满足的条件。
public interface IHeroChecker { /** * 判断Hero是否满足条件 * @param h * @return */ public boolean checker(Hero h); }
写一个过滤方法,判断条件是调用IHeroChecker对象的checker方法,其实就是这个方法中要使用另一个类的方法。
private static void filter(Listheros,IHeroChecker checker) { for (Hero hero : heros) { if(checker.checker(hero)) System.out.print(hero); } } //匿名类对实现此判断方法 IHeroChecker checker = new IHeroChecker() { @Override public boolean checker(Hero h) { return (h.hp>100 && h.damage<50); } }; filter(heros,checker);
使用匿名类实现这个方法,再调用filter方法
3.Lambda 表达式的写法
使用Lambda 表达式就不用写匿名类了,将匿名类演变成Lambda表达式;
1.把匿名类外面的壳子去掉,只保留方法参数和方法体;
2.参数和方法体之间加上符号 ->
3.把return和{}去掉
4.只有一个参数时可以去掉();
//匿名类对实现此判断方法 IHeroChecker checker = new IHeroChecker() { @Override public boolean checker(Hero h) { return (h.hp>100 && h.damage<50); } }; filter(heros,h->h.hp>100 && h.damage<50);
二、与匿名方法关系
与匿名类概念相比较,Lambda 其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。java执行时,还是会将他变成匿名类的.
三、Lambda表达式弊端
1.可读性差,匿名类代码结构比较起来,Lambda表达式一旦变得比较长,不好理解; 2.不便于调试,很难在Lambda表达式中增加调试信息; 3.版本支持,在JDK8以后才有,之前的版本不支持。
四、Lambda表达式方法的引用
前面我们讲了,Lambda表达式其实就是一个方法,把{}和return去掉了而已,那我们如果有现成的方法,用已有的方法代替它该怎么做
1.引用静态方法
已经有了静态方法
public static boolean checker(Hero h) { return h.hp>100 && h.damage<50; }
在Lambda表达式中使用
filter(heros, h -> LambdaTest.checker(h) );
直接引用
filter(heros, LambdaTest::checker);
2.引用对象的方法
引用LambdaTest对象中testHero方法
LambdaTest lambdaTest = new LambdaTest(); filter(heros, lambdaTest::testHero);
3.引用容器对象的方法
在Hero对象中有
private boolean matched(){ return (hp > 100 && damage < 50); }
在Lambda表达式中使用
filter(heros, h -> h.matched());
直接引用
filter(heros, Hero::matched);
五、总结
可以认为Lambda表达式可以看做是一个方法,我们把这个方法直接可以传递到另一个方法中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77817.html
摘要:初体验下面进入本文的正题表达式。接下来展示表达式和其好基友的配合。吐槽一下方法引用表面上看起来方法引用和构造器引用进一步简化了表达式的书写,但是个人觉得这方面没有的下划线语法更加通用。 感谢同事【天锦】的投稿。投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘。因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏...
摘要:而在中,表达式是对象,它们必须依附于一类特别的对象类型函数式接口。即表达式返回的是函数式接口类型。 Java8被称作Java史上变化最大的一个版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表达式和Stream API。这两者也可以结合在一起使用。首先来看下什么是Lambda表达式。Lambda表达式,维基百科上的解释是一种用于表示匿名函数和闭包的运算符,感觉看到这个解释...
摘要:很多语言等从设计之初就支持表达式。注意此时外部局部变量将自动变为作为方法返回值例子返回判断字符串是否为空判断字符串是否为空今天关于新特性表达式就讲到这里了,接下来我会继续讲述新特性之函数式接口。 上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式。 Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码...
摘要:之前,使用匿名类给苹果排序的代码是的,这段代码看上去并不是那么的清晰明了,使用表达式改进后或者是不得不承认,代码看起来跟清晰了。这是由泛型接口内部实现方式造成的。 # Lambda表达式在《Java8实战》中第三章主要讲的是Lambda表达式,在上一章节的笔记中我们利用了行为参数化来因对不断变化的需求,最后我们也使用到了Lambda,通过表达式为我们简化了很多代码从而极大地提高了我们的...
摘要:使用表达式,使得应用变得简洁而紧凑。很多语言等从设计之初就支持表达式。表达式的参数与函数式接口内方法的参数,返回值类型相互对应。更多教程和资料请上腾讯课堂乐字节 showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表达式,允许开发者将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理。...
摘要:函数式编程说前,先理解下什么是函数式编程,如果你是个纯程序员,而且之前一直是没有使用过,可能还没有使用过这种编程方式。表达式可以表示闭包注意和数学传统意义上的不同。意思就是说,只要是接口类型,我们都可以传入表达式。在包下定义了各种函数接口 函数式编程 说lambdas前,先理解下什么是函数式编程,如果你是个纯Java程序员,而且之前一直是没有使用过Java8,可能还没有使用过这种编程方...
阅读 1972·2021-08-21 14:09
阅读 425·2019-08-30 15:44
阅读 2080·2019-08-29 16:32
阅读 1339·2019-08-29 15:36
阅读 3364·2019-08-29 12:43
阅读 2744·2019-08-29 11:14
阅读 377·2019-08-28 18:26
阅读 2207·2019-08-26 13:57