简介
lambda 表达式支持将代码块作为方法参数,lambda 表达式允许使用更简洁的代码来创建一个只有抽象方法的接口(这种接口被称为函数式接口)。
lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。我们先回顾下“匿名内部类”,在出现 Lambda 表达式之前,我们使用的方式如下:
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 接口的匿名内部类
Message msg = new Message() {
@Override
public void print() {
System.out.println("匿名类实现接口");
}
};
// 调用方法
msg.print();
}
}
再看一个线程的例子
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("do something.");
}
}
当出现了 Lambda 表达式之后,我们就可以使用一行代码来处理,我没有说错,就是一行代码就可以搞定。
线程的例子
Runnable r = () -> System.out.println("do something.");
自定义的例子
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 使用 Lambda 实现
Message msga = () -> System.out.println("使用 Lambda 实现");
msga.print();
}
}
看上去觉得完全不可思议,居然还可以这么玩。我们用 () ->
的方式完成了匿名内部类的逻辑,并且方法居然还没有名字。
小结
Lambda 表达代替匿名内部类创建对象时,lambda 表达式的代码块将会代替实现抽象方法的方法体,lambda 表达式就相当于一个匿名方法。
从语法上面看,lambda 表达式的主要作用就是代替匿名内部类的繁琐语法,它由三部分组成:
(形参列表)
形参列表。形参列表允许省略形参类型。如果只有一个参数,甚至可以省略括号。->
箭头。必须通过英文中画线和大于符号组成。代码块
。- 如果代码块只包含一条语句,lambda 表达式允许省略代码块的
{}
. - 如果代码块只有一条 return 语句,甚至可以省略 return 关键字。
- 如果代码块只包含一条语句,lambda 表达式允许省略代码块的
基础语法
对于 lambda 表达式有三种语法格式
() -> 单行语句
。() -> {一段逻辑}
。() -> 表达式
。
代码示例
单行语句
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 直接通过方法来调用
fun(() -> System.out.println("Hello!"));
}
public static void fun(Message msg) {
msg.print();
}
}
单行语句传递参数
// 定义一个接口
interface Message{
public void print(String str);
}
public class TestDemo {
public static void main(String[] args) {
// 直接通过方法来调用, str 为我们传递的参数
fun( (str) -> System.out.println(str));
}
public static void fun(Message msg) {
msg.print("使用 lambda 传递参数"); //使用 lambda 传递参数
}
}
多行语句
使用 {}
块,可以在里面写入多行逻辑
interface Message {
public abstract void print(String str);
}
public class Demo {
public static void main(String[] args) {
fun((s) -> {
s = s.toUpperCase();
System.out.println(s);
});
}
public static void fun(Message msg) {
msg.print("Hello World");
}
}
表达式
interface Message {
public abstract int add(int x, int y);
}
public class Demo {
public static void main(String[] args) {
// 如果是单行表达式,可以不用写 return,编译器会自己推断
fun((s1, s2) -> s1 + s2);
}
public static void fun(Message msg) {
System.out.println(msg.add(10, 90));
}
}