Jdk8新特性
1. Lambda 表达式与函数式编程
Java 8 最引人注目的新特性无疑是 Lambda 表达式。 它允许我们将函数作为方法的参数进行传递,这种将代码像数据一样传递的方式,是函数式编程的核心思想。 Lambda 表达式的引入,使得代码变得异常简洁紧凑,尤其是在处理匿名内部类时,效果更为显著。
Lambda 表达式的基本语法是 (parameters) -> expression 或 (parameters) -> { statements; }。 其能够使用的前提是存在函数式接口,即只包含一个抽象方法的接口。 Java 8 在 java.util.function 包中内置了大量常用的函数式接口,如 Predicate、Consumer、Supplier 等,以满足不同场景的需求。
2. Stream API:高效的集合处理
与 Lambda 表达式相辅相成的是全新的 Stream API (java.util.stream)。 它提供了一种声明式的方式来处理数据集合,让开发者可以像书写 SQL 查询语句一样对集合进行复杂的操作。
Stream API 的核心特点包括:
* 不存储数据:它本身不存储元素,而是对数据源(如集合、数组)进行计算。
* 非侵入性:它不会修改原始的数据源,而是返回一个新的 Stream。
* 延迟执行(惰性求值):中间操作(如 filter, map)并不会立即执行,只有当终端操作(如 collect, forEach)被调用时,整个处理流程才会启动。
通过 Stream API,可以轻松实现对集合的过滤、映射、排序、聚合等操作,并且支持并行处理 (parallelStream),能有效利用多核处理器的性能。
3. 全新的日期和时间 API
在 Java 8 之前,java.util.Date 和 java.util.Calendar 类因其设计缺陷(如可变性、非线程安全、月份从0开始等问题)而备受诟病。
Java 8 引入了全新的 java.time API (JSR-310),彻底解决了这些问题。 该 API 的主要优势在于:
* 不可变性与线程安全:所有核心类(如 LocalDate, LocalTime, LocalDateTime)都是不可变的,确保了线程安全。
* 清晰的设计:API 的设计直观易懂,严格区分了日期、时间、带时区的日期时间等不同概念。
* 强大的功能:提供了丰富的 API 来进行日期的计算、格式化和解析。
4. 接口的默认方法和静态方法
为了在不破坏向后兼容性的前提下为接口添加新功能,Java 8 引入了默认方法和静态方法。
* 默认方法 (Default Methods):使用 default 关键字,允许在接口中提供方法的默认实现。这样,当接口新增方法时,其所有实现类无需强制修改即可自动继承该默认实现,极大地增强了接口的灵活性。
* 静态方法 (Static Methods):接口中也可以定义和实现静态方法,这些方法不能被实现类继承,只能通过接口名直接调用。
5. Optional 类:告别空指针异常
空指针异常 (NullPointerException) 是 Java 开发中极为常见的错误。Java 8 引入了 Optional 类,这是一个可以为 null 的容器对象,旨在更优雅地处理可能为空的值。
Optional 的核心思想是提供一种类型级别的解决方案,明确表示一个值是可选的,从而强制开发者在编译层面就处理好值存在或不存在的两种情况,而不是依赖于运行时的 null 检查。 它提供了 isPresent()、orElse()、map() 等多种实用的方法来避免直接的 if (obj != null) 判断,让代码更加健壮和简洁。