Lambda 表达式在 Java 8 中被引入,它提供了一种简洁的方法来表示一段可以传递的代码块。Lambda 表达式常用于表示简单的方法接口(functional interface)的实例,一个 functional interface 是只有一个抽象方法的接口。Lambda 表达式极大地简化了匿名内部类的写法。
Lambda 表达式基本语法
Lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) -> { statements; }
-
参数列表:它可以包含零个或多个参数,参数类型可以明确声明,也可以由编译器从上下文推断(类型推断)。
-
箭头(->):这个符号用于链接参数列表和lambda体。
-
Lambda体:可以是一个表达式,也可以是一个代码块。
示例
假设我们有一个接口 Runnable
,它没有参数,也没有返回值。
@FunctionalInterface
public interface Runnable {
void run();
}
使用Lambda表达式实现 Runnable
:
Runnable runLambda = () -> System.out.println("This is a lambda expression");
对于只有一个参数的情况,可以省略参数的括号:
Consumer<String> print = s -> System.out.println(s);
如果Lambda体包含了多条语句,需要用大括号括起来:
BiConsumer<Integer, Integer> sum = (a, b) -> {
int result = a + b;
System.out.println("Sum is " + result);
};
Lambda 表达式作为参数
Lambda 表达式最常用的场景之一就是作为方法参数,尤其是在集合的流(stream)操作中:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
Lambda 表达式和 Functional Interfaces
Lambda 表达式通常与 functional interfaces 一起使用。Java 标准库中包含了一些常用的 functional interfaces,例如:
Runnable
Callable<V>
Consumer<T>
Supplier<T>
Function<T,R>
Predicate<T>
Lambda 表达式的优点
- 代码简洁:Lambda 表达式使得代码更加简洁和清晰。
- 可读性强:去掉了冗余的代码,使得程序员可以更专注于执行的操作。
- 易于并行操作:与 Java 8 streams 搭配使用,可以轻松编写并行操作。
注意事项
- Lambda 表达式只能访问 final 或者 effectively final 的局部变量。
- Lambda 表达式在编译后,会被转换为一个私有的静态方法。
- 在使用Lambda表达式的时候,如果接口里有多个方法,则不能使用Lambda表达式(除非显式地指定一个特定方法的实现)。
结论
Lambda 表达式是 Java 8 的一个重要特性,它带来了函数式编程的风格,提高了代码的简洁性和可读性。通过使用Lambda表达式,可以以更少的代码完成更多的任务,尤其是在使用集合和线程时。随着 Java 的发展,Lambda 表达式和相关的功能接口已经成为了日常编程的一部分。