【Java SE】lambda 表达式
lambda
表达式是 Java 8
引入的一种语法糖,用于简化函数式接口的书写。它体现了函数式编程的思想,让程序员更关注对数据的操作,而不是具体的对象。
函数式接口是指只包含一个抽象方法的接口。在
Java
中,可以使用@FunctionalInterface
注解来标识这样的接口。不过,无论是否添加这个注解,只要接口中只有一个抽象方法,它就会被视为函数式接口。
基本格式
(参数列表) -> {代码}
lambda
表达式可以以更简洁的方式定义行为,特别是在处理集合和流时,能够提高代码的可读性和可维护性。通过使用 lambda
表达式,我们可以快速定义一次性的操作,而无需创建额外的类或实现接口,能够有效简化代码的冗余。
实际应用
现在我们来探讨一下 lambda
表达式是如何简化代码的实现过程的。假设存在一个 Message
接口,这个接口有一个 send
抽象方法,用于发送信息:
public interface Message {
void send(String msg);
}
考虑到现实中有多种发送信息的方式,比如通过 email
或是 sms
,因此,我们可以通过定义 Email
类和 SMS
类来实现不同的消息发送方式:
public class Email implements Message {
@Override
public void send(String msg) {
System.out.println("This is an email. The message is : " + msg);
}
}
public class SMS implements Message{
@Override
public void send(String msg) {
System.out.println("This is an sms. The message is : " + msg);
}
}
当我们需要使用不同方式发送消息时,就可以通过 new
不同的对象来实现:
public class Main {
public static void main(String[] args) {
Message message1 = new Email();
sendMessage(message1);
Message message2 = new SMS();
sendMessage(message2);
}
static void sendMessage(Message message) {
String msg = "hello world!";
message.send(msg);
}
}
按照传统的方法,我们可以正确地定义和实现接口。然而,每次需要以不同方式发送消息时,我们都要经过许多步骤。例如,使用电子邮件发送消息时,需要创建一个 Email
类,实现 send
方法,然后实例化 Email
对象,最后才能发送消息。这个过程可以通过使用匿名内部类来简化:
public class Main {
public static void main(String[] args) {
sendMessage(new Message() {
@Override
public void send(String msg) {
System.out.println("This is xxx. The message is : " + msg);
}
});
}
static void sendMessage(Message message) {
String msg = "hello world!";
message.send(msg);
}
}
虽然使用匿名内部类可以简化消息传递的定义,但实际步骤并没有减少,只是省去了命名的麻烦。那么,有没有更简单的实现方式?答案是可以使用 lambda
表达式:
public class Main {
public static void main(String[] args) {
sendMessage((String msg) -> {System.out.println("This is an lambda. The message is : " + msg);});
}
static void sendMessage(Message message) {
String msg = "hello world!";
message.send(msg);
}
}
上述代码使用了 lambda
表达式,使得无需定义类和实例化对象。实际上,只需将匿名内部类的方法参数和函数体转换为 lambda 表达式的格式,就可以实现这种转换。Java
会根据 lambda
表达式自动覆盖相应的抽象方法,从而简化代码。当将 lambda
表达式赋值给函数式接口时,Java
就会利用它来实现接口。
省略规则
在书写 lambda
表达式时,可以通过以下规则化简 lambda
表达式的写法:
- 参数类型可以省略
sendMessage((msg) -> {System.out.println("This is an lambda. The message is : " + msg);});
- 方法体只有一句代码时,大括号、
return
和代码的分号可以省略
sendMessage((msg) -> System.out.println("This is an lambda. The message is : " + msg));
- 方法只有一个参数时小括号可以省略
sendMessage(msg -> System.out.println("This is an lambda. The message is : " + msg));