这里是修真院后端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析后端知识/技能,本篇分享的是:
【
Lambda表达式。
】
https://it-xzy.github.io/JAVA...
大家好,我是IT修真院郑州分院第11期的学员何爽,一枚正直纯洁善良的后端程序员,今天给大家分享一下,修真院官网java(职业)任务10,深度思考中的知识点——Lambda表达式。
1.背景介绍
一、简介
(注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。
建议不要乱用,因为这就和某些很高级的黑客写的代码一样,简洁,难懂,难以调试,维护人员想骂娘.)
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。
总的来说,lambda表达式和 stream 是自Java语言添加泛型(Generics)和注解(annotation)以来最大的变化。
Lambda其实就是匿名方法;Java会在背后,悄悄的,把这些都还原成匿名类方式。匿名类--指的是在声明一个类的同时实例化它,使代码更加简洁精练。
匿名类?
匿名类指的是在声明一个类的同时实例化它,使代码更加简洁精练通常情况下,要使用一个接口或者抽象类,都必须创建一个子类有的时候,为了快速使用,直接实例化一个抽象类,
并“当场”实现其抽象方法。既然实现了抽象方法,那么就是一个新的类,只是这个类,没有命名。这样的类,叫做匿名类。
2.知识剖析
lambda运算符:
所有的lambda表达式都是用新的lambda运算符 " -> ",可以叫他,“转到”或者 “成为”。
运算符将表达式分为两部分,左边指定输入参数,中间是箭头,右边是lambda的主体。
(参数类型 参数名)->{代码主体}
1.标准写法:(类型1 参数名1,类型2 参数名2...)->{代码块}
2.参数类型可以推断 :(参数名1,参数名2...)->{代码块}
3.存在多行代码 :(参数名1,参数名2...)->{代码行;--代码行}
4.单个参数并可推断类型 :(参数名1)->{代码块}
5.方法引用 :System.out::println
6,没有参数 :()->{代码块}
lambda表达式与匿名内部类:
匿名内部类也就是没有名字的内部类正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口PS:Lambda表达式并不能取代所有的匿名内部类,只能用来取代函数接口(Functional Interface)的简写。
lambda表达式与函数式接口:
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
任何接口,如果只包含唯一 一个抽象方法,那么它就是一个Functional Interface。
之前它们被称为 SAM类型,即 单抽象方法类型(Single Abstract Method)。
接口中的方法默认就是public abstract的。
函数式接口需要添加:@FunctionalInterface
3.常见问题
1.如果lambda只能使用一次,那么它的优势又有什么呢?
2.我们为什么需要Lambda表达式呢?
4.解决方案
1.
一.lamada表达式简化了接口实现的过程,使得代码结构更加简洁。
二.lamada的使用非常灵活。
2.
lambda表达式通过实现匿名类的方式对接口或者类进行了实例化,但是因为实例化的对象没有名字,也就无法进行二次使用,所以lambda表达式只能够使用一次,也就只能够使用或者执行一个方法。
简单讲就是:用lambda表达式构造方法实体,等价于实现了接口中的方法,最终lambda表达式的返回值就是接口的实现类。
5.编码实战
6.扩展思考
lambda的优点:
与匿名类 概念相比较,Lambda其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。代码很简洁。
lambda有缺点吗?
- 可读性差,与啰嗦的但是清晰的匿名类代码结构比较起来,Lambda表达式一旦变得比较长,就难以理解。
- 不便于调试,很难在Lambda表达式中增加调试信息,比如日志。
- 版本支持,Lambda表达式在JDK8版本中才开始支持,如果系统使用的是以前的版本,考虑系统的稳定性等原因,而不愿意升级,那么就无法使用。
7.参考文献
https://www.jianshu.com/p/4e8...
https://blog.csdn.net/KOKjock...
https://www.cnblogs.com/frans...
8.更多讨论
Q1:提问人wyq:
lambda还有什么缺点吗?
A1:回答人(h):
lambda表达式的可读性比较差,因此导致其后期的维护工作非常难做。
Q2:提问人:zhh
Lambda表达式有什么作用?
A2:回答人(h):
最直观的作用就是使得代码变得异常简洁。
Q3:提问人:zyq
哪里可以使用Lambda表达式?
A3:回答人(h):
你可以在函数式表达式接口上使用Lambda表达式。
9.鸣谢
此教程是自我查找资料的基础上完善而成。
10.结束语
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~