作者将会从过去 6 年 Java 是如何进步的(从 Java 8 到 Java 15)
Java 发布周期
直到第 8 版,Java 版本每 3 年发布一次,因此版本很少但功能很多。
因此,交付新版本的 Java 很复杂,开发人员升级他们的应用程序也很复杂,因为其中包含的更改数量很多。
这种步伐已经跟不上IT世界一切都越来越快的现实了!所以 Java 架构师决定每 6 个月发布一个版本(因此有一个固定的时间表)
在每个版本中,所有现成的功能都包含在内,那些没有准备好的将在下一个版本中交付(不再是后期版本)。
Java 8 最重要的特性和示例
1) Java 语言的新特性
● forEach() 方法
Java 8 在java.lang.Iterable 接口中引入了forEach 方法,使我们在编写代码时只关注业务逻辑。
● Lambda 表达式
Java 8 最大的新特性是对lambda 表达式的语言级支持(Project Lambda)。
Lambda 表达式语法是 (argument) -> (body)。
●接口的默认和静态方法
在java 8之前,java中的接口只能有抽象方法。默认情况下,接口的所有方法都是公共和抽象的。Java 8 允许接口具有默认方法和静态方法。
- 默认方法:我们在接口中使用默认方法的原因是允许开发人员向接口添加新方法而不影响实现这些接口的类。
-静态方法:在接口中类似于默认方法,除了我们不能在实现这些接口的类中重写这些方法。
例如,新的 Stream 接口上有很多静态方法。这使得“helper”方法更容易找到,因为它们可以直接位于接口上,而不是不同的
类,如 StreamUtil 或 Streams。
●函数式接口
在Java 8 中,函数式接口被定义为具有一个抽象方法的接口。这甚至适用于使用以前版本的 Java 创建的接口。
Java 8 在包 java.util.function 中附带了几个新的函数式接口。
-Function - 获取类型 T 的对象并返回 R。
-Supplier - 仅返回类型 T 的对象。
-Predicate - 返回基于类型 T 的输入的布尔值。
-Consumer - 对给定的 T 类型对象执行操作.
●方法引用
方法引用是一种特殊类型的lambda 表达式。它们通常用于通过引用现有方法来创建简单的 lambda 表达式。
有四种方法引用: -
静态方法
- 特定对象
的实例方法 - 特定类型的任意对象的实例方法 - 构造
函数示例
:
2) Java 库的新特性
● Stream API
Stream 接口是Java 8 的一个基本组成部分。
我们可以使用 Java Stream API 来实现内部迭代,这样更好,因为 java 框架控制了迭代。
Stream 接口支持 map/filter/reduce 模式并延迟执行,构成了
Java 8 中函数式编程的基础(与 lambda 一起)。
出于性能原因,还有相应的原始流(IntStream、DoubleStream 和 LongStream)。
在 Java 8 中,Collection 接口有两种生成 Stream 的方法:
-stream():返回将集合作为其源的顺序流。
-parallelStream() :返回一个以集合为源的并行流。
● Optional
Java 8 附带java.util 包中的Optional 类,用于避免空返回值(以及NullPointerException)。
如果存在一个值,isPresent() 将返回 true,而 get() 将返回该值。流终端操作返回 Optional 对象。
其中一些方法是: -
可选的 reduce(BinaryOperator accumulator) -
可选的 min(Comparator<? super T> comparator) -
可选的 max(Comparator<? super T> comparator) -
可选的 findFirst() -
可选的 findAny()
●日期/时间 API
在 Java 8 中,引入了一个新的日期时间 API 来弥补旧日期时间 API 的以下缺点:
- 线程不安全 -
设计
不佳 - 时区处理困难
Java 8 Date Time API 由以下包组成:
1.java.time 包:这是新的Java Date Time API 的基础包。例如 LocalDate、LocalTime、LocalDateTime、Instant、Period、Duration 等。所有这些类都是不可变的和线程安全的。
- java.time.chrono 包:这个包定义了非 ISO 日历系统的通用 API。我们可以扩展 AbstractChronology 类来创建我们自己的日历系统。
- java.time.temporal 包:这个包包含时间对象,我们可以用它来找出与日期/时间对象相关的特定日期或时间。例如,我们可以使用这些来找出该月的第一天或最后一天。您可以轻松识别这些方法,因为它们的格式始终为“withXXX”。
- java.time.zone 包:该包包含支持不同时区及其规则的类。