1.1. Lambda表达式
通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面:
- lambda表达式是Java8的一个语法糖,用来简化了函数式接口(理解什么是函数式接口)实例的代码量;
- 什么是函数式接口,只有在一个接口是函数式接口时候才能使用lambda表达式简化我们的代码;
所以通过以上两个点,我们需要贯彻始终的观念有三点:
- 明确函数式接口定义,就是有且只有一个抽象方法的接口就是函数式接口,当然加上
@FunctionalInterface
注解更可以确定这个接口是函数式接口; - lambda表达式只能用在函数式接口的实例中,即lambda表达式的语法本质就是函数式接口中那个唯一抽象方法的实现语句;
- 因为函数式接口的抽象方法唯一,所以实现(重写)该方法非常明确,不会造成使用了lambda表达式分不清是该接口的哪个方法被重写了,于是我们就可以简化省略各种不必要的语句,比如对数据类型的判断,返回值的判断,大括号之类的,这就是lambda表达式必须在函数式接口中才能使用的原因。
下面我们通过实例,对比没有lambda表达式时候跟有了lambda表达式之后代码的语法糖,以下示例代码包含了lambda表达式的语法规则
1 | typescript复制代码 |
总结:
- 对比了前后的代码,学会lambda表达式的语法;
- 初步知道什么是函数式接口;
最重要的一点!!!lambda表达式的本质:是作为对应的函数式接口的实例对象!
所以把握住以下两点进行理解:
- lambda表达式的返回值都是对应接口的实例对象;
- lambda表达式的语句是对应接口的方法的具体实现;
1.2 函数式(Functional)接口
函数式接口的定义:
- 只包含一个抽象方法的接口,称为函数式接口。
- 你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
- 我们可以在一个接口上使用
@FunctionalInterface
注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。 - 在
java.util.function
包下定义了Java 8 的丰富的函数式接口
如何理解函数式接口
1 | markdown复制代码1. Java从诞生日起就是一直倡导“一切皆对象”,在Java里面面向对象(OOP)编程是一切。但是随着python、scala等语言的兴起和新技术的挑战,Java不得不做出调整以便支持更加广泛的技术要求,也即java不但可以支持OOP还可以支持OOF(面向函数编程) |
1.2.1. Java内置四大核心函数式接口
通过例子对函数式接口和lambda表达式再进行稍微深入的一点理解,慢慢思考消化。
1 | typescript复制代码package com.ethan.lambda; |
1.2.2. Java的其他函数式接口
以下函数式接口是核心四大函数式接口的子接口,其实函数式编程中,函数是一等公民,我们在java中这样理解:
- 函数就是函数式接口中的那个唯一的抽象方法;
- 其形参参数,我们理解为我们数学中的多元一次方程中的自变量x,y,z,如果有返回值,那么将返回值理解为因变量f(x);
- 函数式接口中的唯一的那个抽象方法只需要理解为对一个或多个对象进行相关的操作(这些操作就是我们自己要去写代码实现的,但是为了能够更加简化语法,此时完全可以将这些操作用lambda表达式去实现,扔掉那些不必要的语句,比如数据类型的判断,多余的括号和return关键字)
1.3 方法引用与构造器引用
1.3.1 方法引用
理解方法引用之前,需要注意,其实方法引用需要你对jdk或者你项目中的方法极其熟悉,才能够熟练使用;
建议:真实开发中其实更建议使用lambda表达式,方法引用理解为主。
方法引用的基本理解
1 | python复制代码 |
总结:
1
复制代码 JDK在Lambda表达式的基础上提出了方法引用的概念,允许我们复用当前项目(或JDK源码)中已经存在的且逻辑相同的方法。
1
复制代码 即,如果已经存在某个方法能完成你的需求,那么你连Lambda表达式都别写了,直接引用这个方法吧。
示例中理解方法引用:
1 | csharp复制代码package com.ethan.methodReferences; |
1.3.2 构造器引用和数组引用
一、构造器引用
格式: ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。
- 和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。即对应抽象方法形参列表的构造器必须存在。
- 抽象方法的返回值类型即为构造器所属类的类型
二、数组引用
格式: type[] :: new
- 将数组看作一个特殊的类,即与构造器引用类型了。
1 | typescript复制代码package com.ethan.methodReferences; |
本文转载自: 掘金