lambda表达式可简洁替代单抽象方法的匿名内部类,如() -> system.out.println("hello");适用于runnable、事件监听等场景,方法引用this::method更简短清晰,但需权衡可读性与复杂度。

直接用 Lambda 表达式替代匿名内部类,一行搞定,语义清晰、无冗余。
用 Lambda 替代匿名内部类(最简写法)
传统匿名内部类写法冗长:
new Runnable() {@Override
public void run() {
System.out.println("Hello");
}
}
Lambda 一行替代,省去类型、方法名、大括号和分号(仅保留逻辑体):
() -> System.out.println("Hello")只要函数式接口只有一个抽象方法(如 Runnable.run()),就能用 Lambda;参数为空时用 (),单条语句可省略花括号和 return(此处无返回值,更简洁)。
在常用上下文中直接使用(无需额外变量)
- 传给
Thread构造器:new Thread(() -> doWork()).start(); - 提交到线程池:
executor.submit(() -> doWork());(注意:submit 接收Runnable或Callable,此处为前者) - Swing/AWT 事件调度:
SwingUtilities.invokeLater(() -> label.setText("Done"));
进一步精简:提取逻辑为方法引用(当逻辑已封装)
如果要执行的方法已存在且签名匹配(无参、无返回),直接用方法引用:
this::doSomething MyUtils::printStatus例如:
new Thread(this::cleanup).start();比 () -> this.cleanup() 更短,且语义更强——明确表示“调用本对象的 cleanup 方法”。
注意事项:别为了省字符牺牲可读性
- 多行逻辑不要硬压成一行 Lambda:
() -> { a(); b(); c(); }可读性差,不如用普通方法 + 方法引用 - 需捕获复杂变量或处理受检异常时,Lambda 会迅速变重,此时匿名内部类或单独方法反而更清晰
- IDE 通常能自动将匿名内部类转换为 Lambda(Alt+Enter / ⌘+Enter),但要确认语义未变











