JDK11新特性学习(一)

// JDK9 --> JDK11(LTS)

局部变量类型推断

JDK7开始支持的类型推断:(由左边推到右边)

List<String> list = new ArrayList<>();

JDK11的类型推断:(由右边推到左边)

var a = "abc";
// 等价于
String a = "abc";

var不是一个关键字,所以无法写 var n; ,类的属性无法使用var。

  1. 设置的目的在于减少代码量,节约了编码时间,属于语法改进。 idea代码重构表示不服~

  2. var还可以用在lambda表达式中,用来与注解结合使用(java中注解只能写在类型前面)

// 这样就可以定义一个被废弃的消费者接口
Consumer<String> consumer = (@Deprecated var t) -> System.out.println(t.toUpperCase());

一些增强的API

创建对象

// list1、list2 不可以添加元素 
List<String> list1 = Arrays.asList("1", "2","3");
List<String> list2 = List.of("1", "2","3");
Set<Integer> set = Set.of(100, 8, 8);
  • asList创建的是Arrays这个类的静态内部类ArrayList,这个内部类没有add方法,使用的是继承自AbstractList的add方法,这个方法直接抛出异常
  • of创建了ImmutableCollections类的ListN,没有add方法,同样是创建的只读集合
  • Set中的of不是添加不了8,而是直接抛出异常

总结:of方法通常作为创建对象使用。比如Stream.of() LocalTime.of() …

字符串处理

String str = "\t  \r\n";
str.isBlank(); // 判断字符串是否为空白  结果为true
str.strip().length();  // 去除字符串首尾的空白  结果为0
str.stripTrailing();  // 去除尾部空白
str.stripLeading();  // 去除首部空白
str.repeat(3);    // 重复打印三次字符串
str.lines().count();  // 字符串切割后变成流,再统计字符串行数
  • trim()是去除字符串首尾的空白。本质是去除码值≤32的空白字符,汉语等语言的空格没办法去除!!
  • " \t abc \n ".trim().length() 结果是6(字符串里包含了一个全角的空格)

文件流

InputStream有了个transferTo方法,可以直接将数据传输到OutputStream
我们在进行原始数据复制的时候不用再考虑中间的过程

// 将file1拷贝到file2
var c1 = this.getClass().getClassLoader();
var inputStream = c1.getResourceAsStream("./file1");
try(var outputStream = new OutputStream("./file2")) {
	inputStream.transferTo(outputStream); // 输入流的数据直接复制到输出流
}
inputStream.close();
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页