JDK8-17的新特性
1. JDK新特性的概述
- 几个重要的版本
- jdk5.0/jdk8.0:里程碑式的版本
- jdk9.0 开始每六个月发布一个新的版本
- LTS:jdk8、jdk11、jdk17
- 如何学习新特性
角度一:新的语法规则(多关注)
自动装箱、自动拆箱、注解、enum、Lambda表达式、方法引用、switch表达式、try-catch变化、记录record等
角度二:增加、过时、删除API
StringBuilder、ArrayList、新的日期时间的API、Optional等
角度三:底层的优化、JVM参数的调整、GC的变化、内存结构的变化(永久代—>元空间)
2. JDK8:lambda表达式
2.1 什么情况下可以使用lambda表达式
- 在给函数式接口提供实例时,都可以考虑使用lambda表达式
- 基本的语法使用(重要)
Lambda表达式的语法规则总结
-> 的左边:lambda形参列表,参数的类型都可以省略,如果形参只有一个,则一对()也可以省略
-> 的右边:lambda体,对应着重写的方法的方法体,如果方法体中只有一行执行语句,则一对{}可以省略
如果有return关键字,则一并省略
2.2 函数式接口
- 常见的函数式接口 Comparator\ Runnable\ java.util.function下定义的丰富的函数式接口
接口 对应的抽象方法
消费型接口:Consumer<T> void accept(T t)
供给型接口:Supplier<T> T get()
函数型的接口:Function<T,R> R apply(T t)
判断型接口:Predicate<T> boolean test(T t)
2.3 方法引用、构造器引用、数组引用
- 方法引用、构造器引用、数组引用:看做是lambda表达式的进一步刻画、表达
- (掌握)方法引用、构造器引用、数组引用的使用场景
- 方法引用
1. 举例:
Integer :: compare;
2. 方法引用的理解
> 方法引用,可以看做是基于lambda表达式的进一步刻画
> 当需要提供函数式接口的实例时,我们可以使用lambda表达式提供此实例
>当满足一定的条件的情况下,我们还可以使用方法引用或构造器引用去替换lambda表达式
3. 方法引用的本质:
方法引用作为了函数式接口的实例 ------>"万事万物皆对象"
4. 格式:
类(或对象) :: 方法名
5. 具体使用情况说明:
情况一: 对象 :: 实例方法
要求:函数式接口中的抽象方法a与其内实现时调用的对象的某个方法b的形参列表和返回值类型都相同
此时,可以考虑使用方法b实现对方法a的替换或覆盖,此替换或覆盖即为方法引用
注意:此方法b是非静态方法,需要对象调用
情况二: 类 :: 静态方法
要求:函数式接口中的抽象方法a与其内实现时调用的类的某个静态方法b的形参列表和返回值类型都相同
此时,可以考虑使用方法b实现对方法a的替换或覆盖,此替换或覆盖即为方法引用
注意:此方法b是静态方法,需要类调用
情况三: 类 :: 实例方法
要求:函数式接口中的抽象方法a与其内实现时调用的对象的某个方法b的返回值类型相同
同时,抽象方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第一个参数作为方法b的调用者,且抽象方法a
的后n-1个参数与方法b的n-1个参数的类型相同(或一致),则可以考虑使用方法b实现对方法a的替换或覆盖,此替换或覆盖即为方法引用
注意点:此方法b是非静态方法,需要对象调用,但是形式上,写成对象a所属的类
- 构造器、数组引用
1. 构造器引用
1.1 格式:
类名::new
1.2 说明:
>调用了类名对应的类中的某一个确定的构造器
>具体调用的是类中的那一个构造器?取决于函数式接口的抽象方法的形参列表!
2. 数组引用
格式:数组名[] :: new
3. JDK8:Stream API的使用
- Stream关注于内存中的多个数据的运算。
- 使用步骤:①Stream API 的实例化 ② 一系列的中间操作 ③ 终止操作
4. JDK8之后的新特性:语法层面
- JShell工具
- try-catch结构变化 try(…){ }
- 局部变量的类型推断: var
- instanceof的模式匹配
- switch表达式、switch的模式匹配
- 文本块的使用: “”文本块“”
- 新的引用数据类型:record(记录)
- 密封类:sealed class
5. JDK8之后的新特性:其他
- Optional类的使用
- 其他:了解