Java10 新特性
局部变量类型推断
局部变量的显示类型声明,常常被认为是不必须的。
- 场景一:类实例化时。在声明一个变量时,总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器。
- 场景二:返回值类型含复杂泛型结构。
- 场景三:经常声明一种变量,它只会被使用一次,而且是用在下一行代码中。
局部变量类型推断适用情况:
package parzulpan.com.Java10;
import java.util.ArrayList;
/**
* @Author : parzulpan
* @Time : 2020-11-30
* @Desc : Java10 局部变量类型推断
*/
public class LocalTypeInference {
public static void main(String[] args) {
//1.局部变量的初始化
var list = new ArrayList<>();
list.add("Tom");
//2.增强for循环中的索引
for(var v : list) {
System.out.println(v);
}
//3.传统for循环中
for(var i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
局部变量类型推断不适用情况:
- 初始值为 null;
- 方法引用;
- Lambda 表达式;
- 为数组静态初始化;
- 情况1:没有初始化的局部变量声明;
- 情况2:方法的返回类型;
- 情况3:方法的参数类型;
- 情况4:构造器的参数类型;
- 情况5:属性;
- 情况6:catch 块。
工作原理:在处理 var 时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。
集合新增创建不可变集合的方法
自 Java9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of
(jdk9新增)和 copyOf
(jdk10新增)方法,它们两个都用来创建不可变的集合。
package parzulpan.com.Java10;
import java.util.ArrayList;
import java.util.List;
/**
* @Author : parzulpan
* @Time : 2020-11-30
* @Desc : Java10 集合新增创建不可变集合的方法
*/
public class CopyOfTest {
public static void main(String[] args) {
var list1 = List.of("Tom", "Jerry", "Hei");
var copy1 = List.copyOf(list1);
System.out.println(list1 == copy1); // true
var list2 = new ArrayList<String>();
var copy2 = List.copyOf(list2);
System.out.println(list2 == copy2); // false
}
}
总结,对于 copyOf(A) ,如果 A 本身就是一个可读集合,则 copyOf(A) 返回值即为 A;如果 A 本身不是一个可读集合,则 copyOf(A) 返回值即为 新的可读集合。