Java Lambda表达式深度解析:从入门到实战
简介
Lambda表达式是Java 8引入的最重要特性之一,它极大地简化了Java代码的编写方式,使函数式编程风格在Java中成为可能。本文将全面介绍Lambda表达式的概念、语法、应用场景以及与相关特性的配合使用,帮助开发者掌握这一强大的编程工具。
一、Lambda表达式基础
1.1 什么是Lambda表达式
Lambda表达式(λ表达式)是Java 8引入的一种匿名函数,它允许我们将函数作为方法的参数传递,或者将代码本身作为数据处理。Lambda表达式本质上是一个函数式接口的实例。
传统匿名内部类 vs Lambda表达式:
// 传统方式 - 匿名内部类
Runnable r1 = new Runnable() {@Overridepublic void run() {System.out.println("传统方式");}
};// Lambda表达式方式
Runnable r2 = () -> System.out.println("Lambda方式");
1.2 Lambda表达式语法
Lambda表达式的基本语法如下:
(parameters) -> expression
或
(parameters) -> { statements; }
语法组成:
- 参数列表:与方法的参数列表相同,可以省略参数类型(编译器可推断)
- 箭头符号:
->
,分隔参数和Lambda体 - Lambda体:可以是表达式或代码块
示例:
// 1. 无参数,返回void
() -> System.out.println("Hello")// 2. 一个参数,可省略括号
x -> x * x// 3. 多个参数
(int x, int y) -> x + y// 4. 带代码块
(String s) -> {System.out.println(s);return s.length();
}
1.3 函数式接口
Lambda表达式需要函数式接口的支持。函数式接口是指仅包含一个抽象方法的接口(可以有多个默认方法或静态方法)。
Java 8在java.util.function
包中提供了许多内置的函数式接口:
接口 | 方法 | 描述 |
---|---|---|
Function<T,R> | R apply(T t) | 接受一个输入,返回一个结果 |
Consumer<T> | void accept(T t) | 接受一个输入,无返回 |
Supplier<T> | T get() | 无输入,返回一个结果 |
Predicate<T> | boolean test(T t) | 接受一个输入,返回布尔值 |
BiFunction<T,U,R> | R apply(T t, U u) | 接受两个输入,返回一个结果 |
自定义函数式接口示例:
@FunctionalInterface // 可选,编译器会检查是否符合函数式接口定义
interface MyFunctionalInterface {void doSomething(String s);default void defaultMethod() {System.out.println("默认方法");}
}
二、Lambda表达式应用场景
2.1 集合遍历
Lambda表达式极大简化了集合遍历的代码:
List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");// 传统方式
for (String lang : languages) {System.out.println(lang);
}// Lambda方式
languages.forEach(lang -> System.out.println(lang));// 方法引用方式(更简洁)
languages.forEach(System.out::println);
2.2 线程初始化
简化线程创建的代码:
// 传统方式
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("传统线程");}
}).start