java lambda表达式可以直接替换只包含单一方法的匿名内部类,从而消除样板代码并提升可读性。具体做法是将匿名内部类的声明和实现块替换为参数列表、箭头符号(->)和方法体,前提是接口必须是函数式接口。如果方法体内仅有一条语句,可以省略大括号;若涉及多行逻辑或局部变量捕获,则保留大括号结构。

Runnable接口的简化对比
对于无参无返回值的Runnable接口,Lambda表达式能显著减少代码行数。原匿名内部类需要显式声明类名、重写方法和花括号,而Lambda直接提供执行逻辑。这种转换要求目标接口只有一个抽象方法,即符合函数式接口规范。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
// 使用 Lambda 替代匿名内部类
executor.submit(() -> System.out.println("Task completed"));
executor.shutdown();
}
}
Comparator排序的简化应用
在集合排序场景中,Comparator是另一个常见的匿名内部类使用场景。通过Lambda表达式,可以将复杂的比较逻辑压缩为一行代码。例如,按字符串长度排序时,无需定义完整的比较器类,只需指定两个参数及其比较结果即可。这种方式使得代码意图更加直观,减少了嵌套层级。
立即学习“Java免费学习笔记(深入)”;

import java.util.Arrays;
import java.util.List;
import java.util.Collections;
public class SortExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("banana", "apple", "cherry");
// 使用 Lambda 替代匿名内部类进行排序
Collections.sort(names, (a, b) -> a.length() - b.length());
System.out.println(names); // [apple, banana, cherry]
}
}
局部变量在Lambda中的访问限制
当Lambda表达式引用外部局部变量时,该变量必须实际上是最终的(effectively final)。这意味着在Lambda定义之后,不能修改该变量的值。这一限制确保了线程安全,因为Lambda通常在异步线程中执行,若允许修改外部状态,可能导致数据竞争。编译器会强制检查这一点,若违反规则将报错。


















