Lambda表达式
Java中的Lambda表达式是Java 8引入的一项功能,它允许通过更简洁的语法来实现函数式编程。Lambda表达式是一个匿名函数(即没有名字的方法),它可以作为参数传递给方法,也可以赋值给变量。Lambda表达式的主要作用是简化代码,使得代码更加简洁和易于理解,特别是在使用像集合类这样的地方。
1. Lambda表达式的基本语法
Lambda表达式的基本语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
- parameters:参数列表,类似于方法的参数列表。
- ->:箭头操作符,分隔参数和表达式/代码块。
- expression:表达式,或者是单个语句。
- statements:代码块,包含多条语句。
2. 使用Lambda表达式的示例
2.1 无参数Lambda表达式
// 创建一个没有参数的Lambda表达式
Runnable r = () -> System.out.println("Hello, Lambda!");
// 启动线程执行Runnable
new Thread(r).start();
代码说明:
- Runnable r = () -> System.out.println(“Hello, Lambda!”); 定义了一个Lambda表达式,它实现了Runnable接口的run方法。此Lambda表达式没有参数,只打印一条消息。
- new Thread®.start(); 创建并启动了一个线程,该线程执行我们定义的Lambda表达式。
2.2 有参数的Lambda表达式
// 使用Lambda表达式定义一个带有参数的Comparator接口实现
Comparator<Integer> comparator = (a, b) -> a.compareTo(b);
// 比较两个整数
int result = comparator.compare(5, 10);
// 输出比较结果
System.out.println(result); // 输出:-1,表示5小于10
代码说明:
- Comparator comparator = (a, b) -> a.compareTo(b); 定义了一个带有两个参数a和b的Lambda表达式,实现了Comparator接口的compare方法。
- int result = comparator.compare(5, 10); 调用比较器,比较两个整数5和10。
- System.out.println(result); 输出比较结果,-1表示前者小于后者。
2.3 带有代码块的Lambda表达式
// 使用Lambda表达式定义一个带有代码块的操作
Consumer<String> greeter = (name) -> {
String greeting = "Hello, " + name + "!";
System.out.println(greeting);
};
// 调用该操作
greeter.accept("World");
代码说明:
- Consumer greeter = (name) -> { … }; 定义了一个Lambda表达式,接收一个字符串参数name,并打印一条问候消息。
- greeter.accept(“World”); 调用了这个Lambda表达式,传入参数"World"。
3. Lambda表达式与函数式接口
Lambda表达式通常与函数式接口一起使用。函数式接口是仅包含一个抽象方法的接口。Java 8引入了@FunctionalInterface注解,用于标识函数式接口。
3.1 自定义函数式接口
// 使用@FunctionalInterface注解定义一个函数式接口
@FunctionalInterface
interface MathOperation {
int operate(int a, int b);
}
// 使用Lambda表达式实现该接口
MathOperation addition = (a, b) -> a + b;
// 调用Lambda表达式
int sum = addition.operate(5, 3);
System.out.println(sum); // 输出:8
代码说明:
- @FunctionalInterface 标识了MathOperation是一个函数式接口。
- MathOperation addition = (a, b) -> a + b; 使用Lambda表达式实现operate方法,实现了两个整数的加法操作。
- int sum = addition.operate(5, 3); 调用该操作,计算5加3的结果并输出。
3.2 使用内置函数式接口
Java 8提供了许多常用的内置函数式接口,如Predicate、Function、Supplier和Consumer。
// 使用内置的Predicate函数式接口
Predicate<String> isLongString = (str) -> str.length() > 5;
// 测试字符串长度是否大于5
boolean result = isLongString.test("HelloWorld");
System.out.println(result); // 输出:true
代码说明:
- Predicate isLongString = (str) -> str.length() > 5; 定义了一个Predicate,它接收一个字符串并返回一个布尔值,表示字符串长度是否大于5。
- boolean result = isLongString.test(“HelloWorld”); 测试字符串"HelloWorld"的长度,结果为true。
4. 方法引用和构造器引用
Lambda表达式还可以通过方法引用和构造器引用进行简化。
4.1 方法引用
// 方法引用的使用
Consumer<String> printer = System.out::println;
// 调用方法引用
printer.accept("Hello, Method Reference!");
代码说明:
- Consumer printer = System.out::println; 使用方法引用简化Lambda表达式,引用了System.out的println方法。
- printer.accept(“Hello, Method Reference!”); 调用方法引用,输出字符串。
4.2 构造器引用
// 定义一个接口,表示对象的创建
interface ObjectCreator {
MyClass create(String name);
}
// 使用构造器引用
ObjectCreator creator = MyClass::new;
// 调用构造器引用创建对象
MyClass obj = creator.create("Lambda");
System.out.println(obj.getName()); // 输出:Lambda
// 自定义的类
class MyClass {
private String name;
public MyClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
代码说明:
- ObjectCreator creator = MyClass::new; 使用构造器引用简化对象的创建。
- MyClass obj = creator.create(“Lambda”); 使用构造器引用创建MyClass对象。