一、Lambda表达式简介
-
什么是Lambda表达式? Lambda是Java 8添加的一个新的特性。说白了,Lambda就是一个匿名函数
-
为什么要使用Lambda? 使用Lambda表达式可以对一个接口进行非常简洁的实现
具体可以对比一下下面几种写法,这三种方式实现的功能完全一致
// 测试使用的main方法
public static void main(String[] args) {
// 1. 使用接口的实现类
Comparator comparator = new MyComparator();
// 2. 使用匿名内部类
Comparator comparator1 = new Comparator() {
@Override
public int compare(int a, int b) {
return a - b;
}
};
// 3. 使用Lambda表达式来实现接口
Comparator comparator2 = (a, b) -> a - b;
System.out.println(comparator.compare(10, 5));
System.out.println(comparator1.compare(10, 5));
System.out.println(comparator2.compare(10, 5));
}
// 定义一个接口 @FunctionalInterface 修饰表名这个接口标记为方法接口,意思是标记这个接口只有一个抽象方法
@FunctionalInterface
interface Comparator {
int compare(int a, int b);
}
// 接口的实现类
class MyComparator implements Comparator {
@Override
public int compare(int a, int b) {
return a - b;
}
}
- Lambda对接口的要求
接口中定义的必须要实现的接口只能有一个
- Java 8 对接口加了一个新的特性:default
二、Lambda表达式的基础语法
具体Lambda长什么样,下面这个就是标准的Lambda构成要素
() : 用户描述参数列表
{} : 用来描述方法体
-> :Lambda运算符,读作 goes to
三、Lambda语法精简
** Lambda 也叫匿名函数的简单实现,既然匿名,我们就不会关心接口名,方法名,参数名, 我们只关心:参数的类型,参数的个数,返回值 **
- 参数类型: 由于接口的抽象方法中,已经定义了参数的数量和类型。所以在Lambda表达式中,参数的类型可以省略 备注:如果需要省略类型,则每个参数的类型都要省略。不能出现省略一个参数类型,不省略一个参数类型
- 参数小括号: 如果参数列表总,参数的数量只有一个,此时的小括号可以省略
- 方法大括号 如果方法体中,只有一个条语句,此时大括号可以省略
- 如果方法体中唯一的一条语句是一个返回语句,则在省略大括号的同时,也必须省略掉return
四、JDK内置的常见接口
TiP:一元函数表示入参只有一个,二元函数表示入参为两个
名称 | 一元接口 | 说明 | 二元接口 | 说明 |
---|---|---|---|---|
一般函数 | Function | 一元函数,抽象apply方法 | BiFunction | 二元函数,抽象apply方法 |
算子函数(输入和输出同类型) | UnaryOperator | 一元算子,抽象apply方法 | BinaryOpertor | 二元算子,抽象apply方法 |
谓词函数(输出boolean) | Predicate | 一元谓词,抽象test方法 | BiPredicate | 二元谓词,抽象test方法 |
消费者(无返回值) | Consumer | 一元消费者函数,抽象accept方法 | BiConsumer | 二元消费函数,抽象accept方法 |
供应者(无参数,只有返回值) | Supplier | 供应者函数,抽象get方法 | — | — |
五、方法引用
可以快速的讲一个Lambda表达式的实现指向一个已经实现的方法
语法: 方法的隶属者::方法名
注意:
1. 参数的数量和类型一定要和接口中定义的方法一致
2. 返回值类型一定要和接口中定会的方法一致
(1)静态方式的引用: (2)非静态方法(实例方法)的引用: (3)构造方法的引用:【使用 new 关键字】
public class QuoteDemo {
public static void main(String[] args) {
// 静态方法引用的写法
Consumer<String> consumer = System.out::println;
consumer.accept("Hello World : static method");
// 静态方法 Lambda 写法
Consumer<String> consumerLambda = s -> System.out.println(s);
consumerLambda.accept("Hello World: static method Lambda");
// 实例一般方法
Quote quote = new Quote();
Consumer<String> consumerInstance = quote::myPrintln;
consumerInstance.accept("Hello World: instance method");
// 构造方法方法引用--无参数
Supplier<Quote> supplier = Quote::new;
System.out.println(supplier.get());
}
}
class Quote {
// 实例方法
public void myPrintln(String name) {
System.out.println(name);
}
// 无参构造方法
public Quote() {
}
}
输出结果:
# 六、参考文章&视频