1.JDK8新特性
1.1 Lambda表达式
Lambda 表达式是一种匿名函数(不是匿名内部类),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它实质属于函数式编程的概念。
虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的抽象方法,不是规定接口中只能有一个方法,称为函数式接口。
->左面: 参数类型可以省略不写,类型推断。 如果只有一个参数,()可以省略不写。
->右侧: {}将方法体的具体内容包裹起来。 方法体中只有一条执行语句,{}可以省略不写。 如果执行语句就一条return语句,return 和 {}可以同时省略不写。
1.2 函数式接口
接口中只能有一个抽象方法,其他的可以有default、static、Object里继承的方法等。JDK8专门提供了@FunctionalInterface注解,用来进行编译检查。
作用:在Java中主要用在Lambda表达式和方法引用(想使用Lambda表达式,接口必须为函数式接口)。
JDK内置的函数式接口
这里特别介绍四个函数式接口:
函数式接口 | 方法名 | 输入参数 | 输出参数 | 作用 |
---|---|---|---|---|
消费型接口Consumer | void accept(T t) | T | void | 对类型为T的对象进行操作 |
供给型接口Supplier | T get() | void | T | 返回类型为T的对象 |
函数型接口Function | R apply(T t) | T | R | 对类型为T的对象进行操作,返回类型为R的对象 |
断言型接口Predicate | boolean test(T t) | T | boolean | 对类型为T的对象进行操作,返回布尔类型结果 |
1.3 方法引用
方法引用是一个更加紧凑,易读的 Lambda 表达式,注意方法引用是一个 Lambda 表达式,方法引用操作符是双冒号 "::"。
方法引用有下面几种方式:
对象引用::实例方法名
类名::静态方法名
类名::实例方法名
类名::new (也称为构造方法引用)
类型[]::new (也称为数组引用)
1.4 stream流式编程
stream是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作或者大批量数据操作。
Stream API借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。
同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。
Stream有如下三个操作步骤:
一、创建Stream:从一个数据源,如集合、数组中获取流。
二、中间操作:一个操作的中间链,对数据源的数据进行操作。
三、终止操作:一个终止操作,执行中间操作链,并产生结果。
1.5 Optional
Optional存在的意义就是简化为了防止空指针而进行的if..else等判断的代码。
获取Optional对象
通过Optional.of()方法,传递的参数的值为null,会出现空指针异常。
通过Optional.ofNullable()方法,创建Optional对象。
获取Optional中存储的值
可以通过get()获取到全局value对应的值。
判断传递的参数是否为null
ifPresent(Consumer<? super T> consumer) 可以判断是否为null
为null, 不会执行Consumer的实现。
不为null, 执行Consumer的实现。
filter() 过滤
2.JDK9新特性
2.1 模块化系统
本质上讲也就是,用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。
模块化的主要目的在于减少内存的开销, 并改进其安全性,可维护性,提高性能。
注意:使用外部模块时,要在当前项目的src目录下创建module-info.java来导入外部的模块并使用。对于当前模块,只有在导出后其他模块才能正常使用。
2.2 JShell命令
以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。
在安装JDK的目录下找到bin目录,在bin目录中找到jshell.exe双击即可运行。
2.3 接口私有方法
默认的情况下,接口中的常量都是共有静态常量,接口中的方法都是抽象方法。JDK8之后接口中可以使用静态方法和默认方法。JDK9之后接口中可以使用私有方法。
2.4 try语句的增强
Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。
Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的。
2.5 String存储结构的改变
String 不再用 char[] 来存储,改成了 byte[] 加上编码标记,节约了一些空间。同时也会影响到StringBuffer 和 StringBuilder中的字符串操作。
2.6 集合特性of()方法
使用of()方法更快捷高效地添加元素来创建一个只读、不可改变的集合。
2.7 InputStream的增强
transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法。
2.8 Stream API的增强
在 Java 9 中,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
除了对 Stream 本身的扩展,Optional 和 Stream 之间的结合也得到了改进。现在可以通过 Optional 的新方法 stream() 将一个 Optional 对象转换为一个(可能是空的) Stream 对象。
2.8.1 takeWhile()
用于从 Stream 中获取一部分数据,通过接收一个 Predicate 来进行条件选择。在有序的Stream 中,takeWhile 会返回从开头开始的尽量多的元素。
2.8.2 dropWhile()
dropWhile 的行为与 takeWhile 相反,返回剩余的元素。
2.8.3 ofNullable()
Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。
2.8.4 iterate新重载方法
这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。
3.JDK10新特性
3.1 局部变量类型推断
在局部变量中使用时,如下情况不适用:
1.初始值为null
2.方法引用
3.lambda表达式
4.为数组静态初始化
3.2 不可变集合copyOf()方法
在JDK10中新增了copyOf()方法,该方法会先判断来源集合是不是AbstractImmutableList 类型。如果是,直接将来源集合返回;如果不是,调用of()创建一个新的集合。
4.JDK11新特性
4.1 ZGC垃圾回收器
GC是java主要优势之一。 然而, 当GC停顿太长, 就会开始影响应用的响应时间。消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台。此外, 现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存, 并且无需长时间的GC暂停时间。
ZGC, A Scalable Low-Latency Garbage Collector(Experimental)ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。 但是后面带了Experimental,说明这还不建议用到生产环境。
ZGC是一个并发, 基于region, 压缩型的垃圾收集器, 只有root扫描阶段会STW(stop the world), 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。
优势
GC暂停时间不会超过10ms
既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
和G1相比, 应用吞吐能力不会下降超过15%
为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
初始只支持64位系统
4.2 Optional增强
4.3 新增Http客户端API
在Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该API 支持同步和异步,而在 Java 11 中已经为正式可用状态,可以在java.net 包中找到这个 API。
它将 替 代 仅 适 用 于 blocking 模 式 的 HttpURLConnection,并提供对WebSocket 和 HTTP/2的支持。
使用HttpClient发送请求和接收响应一般分为以下几步:
- 创建HttpClient对象。
- 创建某种请求方法对象,并按需指定请求信息(包括:URL、请求参数、Header、Cookie等信息)。例如:发送Get请求则创建HttpGet对象,发送Post请求则创建HttpPost对象。
- 调用HttpClient对象的execute方法来执行第2步中创建的请求方法对象,并得到HttpResponse响应对象。
- 通过HttpResponse响应对象按需读取返回结果(包括:返回数据、Header、Cookiet等信息)。
- 释放连接(无论执行方法是否成功,都必须释放连接)。
5.JDK14新特性
5.1 改进空指针异常
Java14之前,NEP报错信息不会指出为Null的实例具体是那一个。Java14以后的NEP则会明确表明,触发NEP的对象是哪个。
6.JDK15新特性
6.1 语言特性增强(Text Blocks)
文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。
7. JDK16新特性
7.1 Switch升级
目的是为了解决switch语句的一些不规则性成为障碍。比如case标签之间的默认控制行为,case块中的默认范围,无意义的break语句。