jdk8 语法
JDK8语法大升级:Lambda/Stream/Optional,让你的Java代码简洁到飞起
Java开发者对JDK8一定不陌生——这个版本就像给Java装上了"语法加速器",用更简洁的代码实现复杂逻辑。从Lambda表达式到Stream API,从接口默认方法到Optional工具类,这些特性彻底改变了我们写Java的方式。今天就用最通俗的例子,带你解锁JDK8的语法魔法。
一、Lambda表达式:把代码"砍半"的匿名函数
如果你曾被匿名内部类折磨过(比如写线程时重复写new Runnable() {}),那Lambda绝对是救星。它的语法像把函数"浓缩"成一行:(参数) -> { 代码 }。比如经典的排序场景:
传统写法:
List<String> list = Arrays.asList("banana", "apple", "cherry");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
Lambda改写:
list.sort((o1, o2) -> o1.compareTo(o2));
短短一行代替了原来的匿名内部类,连Comparator都可以省略!
二、Stream API:给集合装上"流水线"
处理列表时,你还在写for循环?JDK8的Stream API让集合操作像"流水线"一样流畅。核心是"先过滤、再转换、最后聚合",用filter()/map()/reduce()组合实现。
场景:从用户列表中筛选年龄>18的男性,统计他们的姓名长度总和。
传统写法:
List<User> users = ...;
int sum = 0;
for (User user : users) {
if (user.getAge() > 18 && "male".equals(user.getGender())) {
sum += user.getName().length();
}
}
Stream写法:
int sum = users.stream()
.filter(u -> u.getAge() > 18 && "male".equals(u.getGender()))
.mapToInt(u -> u.getName().length())
.sum();
一行代码完成多步操作,可读性直接拉满。
三、接口"进化":默认方法让代码不"打架"
以前接口只能定义抽象方法,现在JDK8允许接口带默认实现——就像给接口"留了个后门",新增方法时老代码不用大改。
举例:定义一个MessageService接口,新增默认通知方法:
public interface MessageService {
// 抽象方法
void send(String message);
// 默认方法(带实现)
default void log(String message) {
System.out.println("日志:" + message);
}
}
// 实现类直接继承默认方法,无需重复编写
public class SmsService implements MessageService {
@Override
public void send(String message) {
System.out.println("发送短信:" + message);
}
}
现在SmsService直接用log()方法,再也不用每个实现类都写日志逻辑了。
四、Optional:和NullPointerException说拜拜
NullPointerException是Java开发者的"噩梦",JDK8用Optional类优雅解决——把"必须判空"的代码变成"链式调用"。
场景:获取用户的地址信息,如果用户不存在则返回默认地址。
传统写法:
User user = ...;
Address address = null;
if (user != null) {
address = user.getAddress();
}
if (address == null) {
address = new Address("默认地址");
}
Optional写法:
Address address = Optional.ofNullable(user)
.map(User::getAddress)
.orElse(new Address("默认地址"));
Optional.ofNullable()处理空值,map()安全取值,orElse()兜底返回默认值,一行搞定!
五、方法引用:Lambda的"偷懒"版

如果Lambda表达式只是调用一个方法,用::操作符(方法引用)能再简化代码。比如User::getName等价于u -> u.getName()。
Stream中的应用:
List<User> users = ...;
users.stream()
.map(User::getName) // 代替 s -> s.getName()
.forEach(System.out::println); // 代替 s -> System.out.println(s)
代码瞬间变得像"一行诗"。
写在最后:JDK8语法的"真香"时刻
从Lambda的"一行代百行",到Stream API的"链式操作",再到Optional的"空安全护盾",JDK8彻底重构了Java的编码体验。这些语法不是"花架子",而是实实在在让代码更短、更安全、更易维护。
下次写Java代码时,不妨试试用Lambda代替匿名类,用Stream处理集合,用Optional包裹可能为空的对象——你会发现,原来代码可以这么优雅!
(字数:约780字)








