
### **1. 引言 🚀**
🔥 **Lambda** 表达式是Java在JDK8中引入的一项创新特性,它极大地简化了Java代码的编写,尤其是在处理集合遍历和操作时。Lambda表达式允许我们将函数作为参数传递,使得代码结构更加优雅和高效。JDK提供了丰富的内置函数式接口,进一步增强了Lambda表达式的实用性。
* **Lambda 表达式** 可以视为一种匿名函数,其名称来源于数学中的λ演算,有时也被称作闭包(Closure)。
* **Lambda** 表达式的用例:简化接口的实现。
### **2. 基础应用 🖊**
#### 🥑 1. 语法结构
🎈 Lambda表达式的构成包括**参数列表(parameters)、箭头符号(->)和方法体(expression 或 statements)**。
* **参数列表**:类似于方法中的参数列表,这里的参数属于函数式接口中的参数。参数类型可以明确声明,也可以由JVM隐式推断。若只有一个参数且类型可推断,则可以省略圆括号。
* **箭头符号**:表示“用于”的意思。
* **方法体**:可以是单个表达式或代码块,对应函数式接口中方法的实现。
* 代码块可以返回值或不返回,类似于方法的方法体。
* 若为表达式,则执行后返回结果;若为语句块,则按顺序执行,类似于方法中的语句。
Lambda表达式的常见语法格式如下:
**语法格式**| **描述**
---|---
`() -> System.out.println("Hello IsLand1314");`| 无参数,无返回值
`(x) -> System.out.println(x);`| 有一个参数,无返回值
`x -> System.out.println(x);`| 单个参数时,可省略括号
`Comparatorcom = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); };`| 两个以上参数,有返回值,多条语句
`Comparatorcom = (x, y) -> Integer.compare(x, y);`| 单条语句时,省略return和大括号
`(Integer x, Integer y) -> Integer.compare(x, y)`| 参数类型可省略,由编译器通过上下文推断,即“类型推断”
#### 🥑 2. 函数式接口
🥑 Lambda表达式简化了接口的实现,但并非所有接口都适用。
🧃 Lambda表达式本质上是一个匿名方法。当接口中的方法数量不为一时,Lambda表达式不适用。
* Lambda表达式只能实现函数式接口,**函数式接口**定义:一个接口中只有一个抽象方法。
如下:
```java
// 函数式接口,只有一个抽象方法
interface Test {
public void test();
}
- 一个接口中,要求实现类必须实现的抽象方法只有一个!这样的接口就是函数式接口。
补充:
🔖 @FunctionalInterface
- 是一个注解,用于接口前,判断该接口是否为函数式接口。
- 如果是函数式接口,没有问题。如果不是,则报错。
- 功能类似于@Override
@FunctionalInterface
interface NoParameterNoReturn {
// 注意:只能有一个方法
void test();
}
但这种形式也是可行的:
@FunctionalInterface
interface NoParameterNoReturn {
void test();
default void test2() {
System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");
}
}
注意:
- 如果一个接口只有一个抽象方法,则该接口为函数式接口。
- 如果我们在某个接口上声明了@FunctionalInterface注解,编译器将按照函数式接口的定义来要求该接口,若有两个抽象方法,程序编译会报错。
- 因此,从某种意义上说,只要你确保接口中只有一个抽象方法,可以不使用该注解。使用它将自动进行检测。
- Lambda表达式只能简化函数式接口的匿名内部类的写法。
🥑 3. 实际应用
🌈 如前所述,Lambda表达式本质上是一个匿名函数,其方法为:返回值 方法名 参数列表 方法体。
- 在Lambda表达式中,我们只需关注:**参数列表
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4572.html