写 Java 的人,常遇到这种场景:给一个按钮加点击事件,或者对 List 排个序。以前得先写个内部类,甚至单独建个类文件——光是写 public class MyClickListener implements OnClickListener 这一行,手就有点累。
类太重,lambda 来救场
Java 8 引入 lambda 表达式后,很多「只用一次、逻辑简单」的类,直接缩成一行。比如排序:
Collections.sort(names, (a, b) -> a.length() - b.length());以前得写个 Comparator 类或匿名类,现在连名字都不用起,参数、箭头、逻辑全挤在括号里,干净利落。
但 lambda 不是万能胶
它只能替代函数式接口(只有一个抽象方法的接口),像 Runnable、Comparator、Consumer 这些没问题;可一旦要实现多个方法、带状态、需要复用或调试,还是得靠正经的类。
比如你写一个网络请求回调,既要处理成功、又要捕获异常、还要记录日志、下次还得复用——这时候硬塞进 lambda,代码会迅速变皱,不如老老实实建个 NetworkCallback 类,字段、方法、注释都安排明白。
再看一个对比
模拟用户登录验证逻辑:
// 用 lambda(适合简单判断)
Predicate<String> isValidEmail = s -> s != null && s.contains("@");
// 用类(适合带规则、可扩展)
class EmailValidator {
private final String domain;
EmailValidator(String domain) { this.domain = domain; }
boolean validate(String email) {
return email != null && email.endsWith("@" + domain);
}
}前者随手一写就跑,后者改域名、加黑名单、记失败次数都方便。
说白了,lambda 是「即开即用」的工具刀,类是「可组装、能升级」的工具箱。选哪个,不看时髦,看手头这活儿要不要留后路。