Lambda Expression in Java

Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure)

lambda

传统的接口实现方法

1
2
3
4
public interface Vehicle {  
//Abstract method
void start();
}

具体实现方法,将接口的声明与具体实现分开

1
2
3
4
5
public class Car implements Vehicle {  
public void start() {
System.out.println("starting car engine");
}
}
1
2
3
4
5
public class Bus implements Vehicle {  
public void start() {
System.out.println("starting bus engine");
}
}
1
2
3
4
5
public class Truck implements Vehicle {  
public void start() {
System.out.println("starting truck engine");
}
}

业务中就只需要关心方法,从而实现代码的解耦和模块化

1
2
3
void startEngine(Vehicle vehicle) {  
vehicle.start()
}

我们可以从另外一个例子中来回顾下这个问题,我们一个信息发送接口,具体的实现类有通过Email和SMS等等。

1
2
3
public interface Message {  
void send();
}

Email实现类

1
2
3
4
5
6
7
8
9
10
public class Email implements Message {  

String email;

public Email() {}

public void send() {
System.out.println("This is a email.");
}
}

SMS实现类

1
2
3
4
5
6
7
8
9
10
public class Sms implements Message {  

String phoneNumber;

public Sms() {}

public void send() {
System.out.println("This is a sms.");
}
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SIT {  

static void sendMessage(Message message) {
message.send();
}

@Test
public void test_message_email() {
Message message = new Email();
sendMessage(message);
}

@Test
public void test_message_sms() {
Message message = new Sms();
sendMessage(message);
}
}

这种传统方法的弊端显而易见,创建了多个实现类,Lambda表达式应运而生

Lambda实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestSIT {  

static void sendMessage(Message message) {
message.send();
}

@Test
public void test_message_email() {
/*
如果只包含一条实现语句,也可以取消大括号,详见test_message_sms的写法,如果
实现包含多条语句,则要求使用大括号
*/
sendMessage(() -> {
System.out.println("This is email.");
});
}

@Test
public void test_message_sms() {
sendMessage(() -> System.out.println("This is sms."));
}
}

实现的方法包含参数的情况

1
2
3
public interface Message {  
void send(String name);
}

Lambda实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestSIT {  

static void sendMessage(Message message) {
message.send("Edison");
}

@Test
public void test_message_email() {
sendMessage((name) -> {
System.out.println("This is email to " + name);
});
// 上面的表达语句可以进一步简化成这样1行
sendMessage(name -> System.out.println("This is email to " + name));
// 运行完成,console print => This is email to Edison
}
}

实现方法包含2个以上的参数

1
2
3
public interface Message {  
void send(String name, String title);
}

Lambda实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class TestSIT {  

static void sendMessage(Message message) {
message.send("Edison", "Mr");
}

@Test
public void test_message_email() {
sendMessage((name, title) -> {
System.out.println("This is email to " + title + " " + name);
// console print => This is email to Mr Edison
});
}
}

具体实现包含返回值

我们修改下测试的interface

1
2
3
public interface Message {  
String send(String name, String title);
}

包含返回值的对应Lambda实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestSIT {  

static void sendMessage(Message message) {
String status = message.send("Edison", "Mr");
System.out.println(status);
}

@Test
public void test_message_email() {
sendMessage((name, title) -> {
System.out.println("This is email to " + title + " " + name);
return "success!";
});
}
/*
console print =>
This is email to Mr Edison
success!
*/
}

Lambda表达式也可以像普通变量那样赋值给变量

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test  
public void test_message_email() {
Message lambda = (name,title) -> {
System.out.println("This is a sms to "+title+" " +name);
return "success!";
};
sendMessage(lambda);
/*
console print =>
This is a sms to Mr Edison
success!
*/
}

有且只有一个抽象方法的interface上,同时我们成这样的接收为Functional Interface,同时我们可以在接口上加注解@FunctionalInterface

1
2
3
4
@FunctionalInterface  
public interface Message {
String send(String name,String title);
}

Lambda Expression in Java
https://skynetboys.github.io/2023/10/21/Lambda-Expression-in-Java/
Author
Edison
Posted on
October 21, 2023
Licensed under