Java 8 新特性:最实用的 5 个工作必用特性
Java 8 的发布是 Java 历史上的一次重大革新,至今仍是绝大多数企业级应用的主流版本。以下是工作中最实用、出现频率最高的 5 个新特性。
1. Lambda 表达式
这是 Java 8 的灵魂。它让你能够将函数作为参数传递,告别了冗长的匿名内部类。
- 核心价值:让代码更简洁、可读性更强,是后续使用 Stream 的基础。
- 工作必用场景:
-
集合排序
list.sort((a, b) -> a.getId().compareTo(b.getId())); -
多线程
new Thread(() -> System.out.println("跑起来")).start(); -
事件监听、接口回调等几乎所有需要函数式接口的地方。
-
2. Stream API
用于处理集合数据的利器,支持链式编程和并行计算。在工作中,凡是涉及对列表(List)或集合(Set)进行过滤、转换、统计的场景,基本都会被它取代。
- 核心价值:将复杂的 for 循环压缩为一行代码,支持惰性求值和并行处理。
- 工作必用场景:
-
遍历
list.forEach(System.out::println); -
过滤
list.stream() .filter(u -> u.getAge() > 18) .collect(Collectors.toList()); -
提取某列
list.stream() .map(User::getName) .collect(Collectors.toList()); -
分组统计
Map<String, List<User>> map = list.stream() .collect(Collectors.groupingBy(User::getDept));
-
3. Optional 类
一个用来解决广受诟病的空指针异常的容器类。它通过显式的 API 强制开发者思考“变量可能为空”的情况。
- 核心价值:避免代码中出现大量的
if (obj != null)判空嵌套,使代码更健壮、语义更清晰。 - 工作必用场景:
-
链式调用
String name = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("未知"); -
防御性编程:在接收数据库查询结果或前端参数时,用它来包装可能为空的对象,优雅地处理默认值或抛出业务异常。
-
4. 新的日期和时间 API (java.time)
旧版 Date 和 Calendar 在设计上存在诸多问题(可变性、线程不安全、月份从 0 开始等)。Java 8 引入了全新的日期时间 API,基于 JSR-310 规范。
- 核心价值:线程安全、不可变、API 设计清晰直观,完美区分了“日期”、“时间”、“带时区的时间”和“时间戳”。
- 工作必用场景:
-
获取当前日期
LocalDate.now(); LocalDateTime.now(); -
日期计算
LocalDate nextMonth = today.plusMonths(1); -
比较与判断
boolean isAfter = date1.isAfter(date2); -
格式化(线程安全)
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-
5. 方法引用 (Method Reference)
它是 Lambda 表达式的一种简化写法。当你只需要调用一个已存在的方法时,使用双冒号 :: 可以让代码比 Lambda 更加简洁优雅。
- 核心价值:进一步增强代码的可读性,减少样板代码。
- 工作必用场景:
-
静态方法
list.stream().map(Math::abs); -
实例方法
list.forEach(System.out::println); -
构造方法
Supplier<User> supplier = User::new;
-
总结
在如今的日常开发中,Lambda + Stream 基本已经成为处理集合数据的标准写法;Optional 用于返回值判空保护;新日期 API 彻底取代了 Date;方法引用 则作为 Lambda 的补充,让代码更简洁。熟练运用这 5 个特性,是写出优雅、健壮且符合业界规范的 Java 代码的基础。