JDK8 是 Java 史上使用率最高、企业开发必备 的版本,核心新特性完全改变了 Java 的编码风格,以下是开发中 100% 会用到的核心特性,按使用频率排序:
一、Lambda 表达式(最核心)
语法 :(参数) -> { 代码体 },无参数、单参数、多行代码都有简化写法。
作用 :简化 匿名内部类,让代码更简洁,是所有新特性的基础。
适用场景:接口只有一个抽象方法(函数式接口),如 Runnable、Comparator、集合遍历。
java
// 旧写法:匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("旧写法");
}
}).start();
// JDK8 Lambda 写法
new Thread(() -> System.out.println("Lambda 简化写法")).start();
二、Stream 流(集合处理神器)
作用 :一行代码完成集合的过滤、排序、分组、求和、去重等操作,彻底告别 for 循环。
适用场景:List/Map/Set 数据处理、报表计算、数据筛选、集合转换。
常用操作 :filter/map/sorted/distinct/limit/count/groupingBy(分组)。
java
List<User> userList = new ArrayList<>();
// 需求:筛选年龄>18岁的用户,按年龄升序,提取名字集合
List<String> nameList = userList.stream()
.filter(user -> user.getAge() > 18) // 过滤
.sorted(Comparator.comparing(User::getAge)) // 排序
.map(User::getName) // 提取字段
.collect(Collectors.toList()); // 转集合
三、方法引用(Lambda 简化)
作用:进一步简化 Lambda 代码,直接引用已有方法。
格式 :类名::方法名 或 对象::方法名
java
// Lambda 写法
list.forEach(s -> System.out.println(s));
// 方法引用简化
list.forEach(System.out::println);
四、函数式接口
作用 :专门为 Lambda 设计的接口,只有一个抽象方法,JDK 内置了大量常用接口。
开发常用 4 个核心接口:
- Consumer<T> :消费型接口,有入参无返回值 →
forEach用 - Supplier<T>:供给型接口,无入参有返回值
- Function<T,R> :函数型接口,有入参有返回值 →
map用 - Predicate<T> :断言型接口,有入参返回布尔 →
filter用
五、Optional 类(解决空指针)
作用 :优雅处理对象为 null 的情况,彻底避免 NullPointerException。
适用场景:对象判空、获取嵌套属性、默认值赋值。
java
// 旧写法:繁琐的判空
if (user != null && user.getAddress() != null) {
String city = user.getAddress().getCity();
}
// JDK8 Optional 一行搞定
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("默认城市"); // 为空时返回默认值
六、日期时间 API(java.time)
作用 :替代笨重的 Date、Calendar,线程安全、API 简洁易用。
核心类 :LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)、DateTimeFormatter(格式化)
java
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 格式化(线程安全,不用再用 SimpleDateFormat)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatTime = now.format(formatter);
// 日期计算
LocalDate tomorrow = LocalDate.now().plusDays(1);
七、JDK8 与 JDK7 最核心区别
1. 最核心、最本质的区别
- **JDK7面向过程、命令式编程:**写循环、嵌套判断、代码冗长、空指针多、日期 API 线程不安全。
- JDK8函数式编程 + 流式编程: 简洁、高效、优雅,彻底改变 Java 编码风格。
2. 关键功能区别
1) 语法层面
- JDK7:只能用匿名内部类,代码冗长。
- JDK8 :Lambda 表达式,代码极简。
2) 集合处理
- JDK7:必须手写 for 循环、过滤、排序、转换,代码量大。
- JDK8 :Stream 流,一行处理集合(过滤 / 排序 / 分组 / 求和)。
3) 空指针安全
- JDK7 :大量
if(obj != null),容易漏写导致 NPE。 - JDK8 :Optional 优雅处理空值。
4) 日期时间 API
- JDK7 :Date、Calendar、SimpleDateFormat 线程不安全,难用。
- JDK8 :全新
java.time包(LocalDate、LocalDateTime)线程安全。
5) 接口功能
- JDK7:接口只能有抽象方法,实现类必须全部重写。
- JDK8 :接口支持 default 默认方法 、static 静态方法。
6) 方法引用
- JDK7:无。
- JDK8 :
类::方法简化 Lambda。
7) 函数式接口
- JDK7:无专门规范。
- JDK8:内置大量函数式接口(Predicate、Function、Consumer、Supplier)。
8) HashMap 底层
- JDK7:数组 + 链表,链表过长性能差。
- JDK8 :数组 + 链表 + 红黑树,查询效率大幅提升。
9) 并发与工具类
- JDK8:新增并行流、CompletableFuture、Base64 内置工具。
- JDK7:无这些。