Java中 接口怎么配合 Lambda 表达式简化匿名内部类实现

作者:袖梨 2026-07-14
Java中接口配合Lambda表达式简化匿名内部类的前提是该接口必须为函数式接口,即仅含一个抽象方法;Lambda本质是该抽象方法的简洁实现,可替代冗长的匿名内部类写法,如Runnable、Comparator等均属此类。

Java 中接口配合 Lambda 表达式简化匿名内部类,核心前提是该接口必须是函数式接口——即只定义了一个抽象方法(允许有默认方法或静态方法)。Lambda 表达式本质就是这个抽象方法的简洁实现,替代了冗长的匿名内部类写法。

函数式接口是前提

只有被 @FunctionalInterface 标注(或实际满足条件)的接口才能用 Lambda。例如:

  • Runnable:只有 run()
  • Comparator<T>:只有 compare(T, T)
  • Function<T,R>:只有 apply(T)

如果你自定义接口,确保它只有一个抽象方法,否则编译报错。

Lambda 替代匿名内部类的写法对比

以启动线程为例:

立即学习“Java免费学习笔记(深入)”;

传统匿名内部类:

new Thread(new Runnable() {
  public void run() {
    System.out.println("Hello");
  }
}).start();

等价的 Lambda 写法:

new Thread(() -> System.out.println("Hello")).start();

关键变化:

  • 省去 new Runnable()public void run() 声明
  • 参数列表、箭头 ->、方法体直接对应抽象方法的签名
  • 当方法体只有一条语句,可省略花括号和 return(若需返回值)

带参数和返回值的 Lambda 示例

比如使用 Comparator 排序:

list.sort(new Comparator<String>() {
  public int compare(String s1, String s2) {
    return s1.length() - s2.length();
  }
});

换成 Lambda:

list.sort((s1, s2) -> s1.length() - s2.length());

说明:

  • 参数类型可省略(编译器能推断),如 (String s1, String s2) 可简写为 (s1, s2)
  • 如果只有一行表达式,直接写结果;如果是代码块,需加花括号和 return

自定义函数式接口 + Lambda

定义一个简单接口:

@FunctionalInterface
interface Calculator {
  int operate(int a, int b);
}

使用时直接传 Lambda:

Calculator add = (x, y) -> x + y;
Calculator multiply = (x, y) -> x * y;
System.out.println(add.operate(3, 4)); // 输出 7

这样既保持接口的语义清晰,又避免了每次 new 实现类的样板代码。

相关文章

精彩推荐