第七章:Java 8新特性
7.1 Lambda表达式
1. Lambda表达式简介
Lambda表达式是Java 8引入的一种简洁的匿名函数表示方式,用于简化函数式接口的实现。它允许将函数作为方法参数传递,使代码更加简洁和灵活。
2. Lambda表达式的语法
Lambda表达式的基本语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
示例:
// 无参数
() -> System.out.println("Hello, Lambda!");
// 单参数
x -> x * x;
// 多参数
(int x, int y) -> x + y;
// 多行语句
(String s) -> {
System.out.println("Input: " + s);
return s.length();
};
3. 函数式接口
Lambda表达式通常与函数式接口(Functional Interface)一起使用。函数式接口是仅包含一个抽象方法的接口,可以使用@FunctionalInterface注解标记。
常见的函数式接口:
Runnable:() -> voidConsumer<T>:(T t) -> voidSupplier<T>:() -> TFunction<T, R>:(T t) -> RPredicate<T>:(T t) -> boolean
示例:
@FunctionalInterface
interface Greeting {
void sayHello(String name);
}
public class LambdaExample {
public static void main(String[] args) {
Greeting greeting = name -> System.out.println("Hello, " + name);
greeting.sayHello("Alice"); // 输出:Hello, Alice
}
}
4. Lambda表达式的优势
- 简洁性:减少冗余代码,提高可读性。
- 函数式编程支持:便于实现函数式编程范式。
- 并行处理:结合Stream API支持并行操作。
5. 方法引用
Lambda表达式的一种简化形式,通过::操作符引用已有方法。
方法引用的类型:
- 静态方法引用:
ClassName::staticMethod - 实例方法引用:
instance::method - 构造方法引用:
ClassName::new
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // 实例方法引用
6. 注意事项
- Lambda表达式只能用于函数式接口。
- 局部变量在Lambda中使用时必须是
final或等效final(不可修改)。 - 避免过度使用Lambda表达式,以免降低代码可读性。
7. 实际应用场景
- 集合遍历与操作(如
forEach、filter、map)。 - 事件监听(如GUI编程中的按钮点击事件)。
- 多线程编程(如
Runnable实现)。
通过Lambda表达式,Java 8显著提升了代码的简洁性和功能性,为开发者提供了更强大的工具支持函数式编程风格。
