Java 8 Lambda Expressions

本文最后更新于 2024年4月16日 上午

Introduction

Lambda 表达式是 Java 8 中引入的一个重要特性,它使得代码更加简洁、清晰和易于阅读。Lambda 表达式可以理解为一种匿名函数,它可以作为方法参数传递,也可以作为方法返回值返回。简单来说,Lambda 表达式就是对一个函数式接口中唯一抽象方法的实现。

Lambda 表达式的基本语法

1
(parameters) -> expression

1
(parameters) -> { statements; }

其中:

  • parameters:表示 Lambda 表达式的参数列表。
  • ->:箭头符号,分隔参数列表和表达式或语句块。
  • expression:表示 Lambda 表达式的执行体,通常是一个表达式。
  • { statements; }:表示 Lambda 表达式的执行体,通常是一段代码块。

In Practice

作为方法参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class LambdaExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("John");
names.add("Doe");
names.add("Alice");

// 使用 Lambda 表达式作为方法参数传递
names.forEach(name -> System.out.println("Hello, " + name));

// 使用方法引用作为方法参数传递(与 Lambda 表达式等效)
names.forEach(System.out::println);
}
}

作为方法返回值返回

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.function.BinaryOperator;

public class LambdaExample {
public static void main(String[] args) {
// 返回 Lambda 表达式作为方法的结果
BinaryOperator<Integer> add = (a, b) -> a + b;
System.out.println("Sum: " + add.apply(5, 3));

// 返回方法引用作为方法的结果(与 Lambda 表达式等效)
BinaryOperator<Integer> subtract = Math::subtractExact;
System.out.println("Difference: " + subtract.apply(5, 3));
}
}

Lambda Scope

在 Lambda 作用域中访问外部变量和再匿名内部类中类似,既可以访问 final 变量也可以访问实例和静态字段。

但与匿名内部类不同的是 外部变量比如下面的 num 不一定必须是 final 修饰 但是 num 必须隐式是 final 即不可修改的。

1
2
3
4
5
6
7
8
// final int num = 1;
int num = 1;
// int finalNum = num;
// Variable used in lambda expression should be final or effectively final
Converter<Integer, String> converter = (from -> String.valueOf(from + num));
String s1 = converter.convert(2);
System.out.println("s1 = " + s1);
// num = 3;

Java 8 Lambda Expressions
https://stein283036.github.io/2024/04/15/Java-8-Lambda-Expressions/
作者
倪京龙
发布于
2024年4月15日
更新于
2024年4月16日
许可协议