月26日,Java 11(LTS 长期支持版)如期而至,虽然短期很难投入生产使用(毕竟现在还在用jdk7呢,哈哈哈哈)但是还是非常有必要了解一下相关的特性的。
jshell
使用jshell可以像python交互模式那样直接运行代码

编译 && 运行
简化了javac & java命令
1
2
3
4
5
|
javac Test.java
java Test
#### jdk 11
java Test.java
|
局部类型推断
1
2
3
4
5
6
|
var msg = "Hello Java11";
System.out.println(msg instanceof String); // true
var list = new ArrayList<String>();
System.out.println(list instanceof List); // true
|
var关键字的相关限制:
- 使用var声明变量时必须有初始值
- var 声明的必须一个显式的目标类型,比如不可以用在lamdba变量或数组变量上
- var不能声明不可表示的类型,包括:null类型,交叉类型以及匿名类类型
交叉类型详解:https://www.w3cschool.cn/java/java-intersection-type.html
String API
一次性将字符串按照换行符分割并返回所有行的流
1
2
3
4
5
6
7
|
var content = "hellonworldnjava11";
content.lines().collect(Collectors.toList()).forEach(System.out::println);
/**
* hello
* world
* java11
*/
|
- String repeat(int count);
将字符串重复N次,如:重要的话说3遍!
1
2
3
|
var message = "重要的话说3遍!";
System.out.println(message.repeat(3));
// 重要的话说3遍!重要的话说3遍!重要的话说3遍!
|
- boolean isBlank(); 判断字符串是否为空
- String strip(); 删除字符串头尾的所有空白符
- String stripLeading(); 删除字符串头部的所有空白符
- String stripTrailing(); 删除字符串尾部的所有空白符
Collection API
集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合
1
2
3
4
5
6
7
|
var list = List.of("Hello", "World", "Java11");
var copy = List.copyOf(list);
System.out.println(list == copy); // true
var list1 = new ArrayList<String>();
var copy1 = List.copyOf(list);
System.out.println(list1 == copy1); // false
|
有一点需要注意的是,使用 of 和 copyOf 创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作!
Stream API
1
|
Stream.ofNullable(null).count(); // 0
|
- 增加 takeWhile 和 dropWhile 方法
1
2
3
4
|
// 从开始计算,当 n < 3 时就截止。
Stream.of(1, 2, 3, 2, 1).takeWhile(n -> n < 3).collect(Collectors.toList()).forEach(System.out::println); // [1, 2]
// 一旦 n < 3 不成立就开始计算
Stream.of(1, 2, 3, 2, 1).dropWhile(n -> n < 3).collect(Collectors.toList()).forEach(System.out::println); // [3, 2, 1]
|
Optional API
1
2
3
|
Optional.of("Java11").orElseThrow(); // java11
Optional.of("Java11").stream().count(); // 1
Optional.ofNullable(null).or(() -> Optional.of("Java11")).get(); // java11
|
使用long transferTo(OutputStream out)方法可以直接将数据传输到OutputStream;
HTTP Client API
有这玩意儿后,可以扔掉难用的Apache HttpClient了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var request = HttpRequest.newBuilder()
.uri(URI.create("http://baidu.com"))
.GET()
.build();
var client = HttpClient.newHttpClient();
// 同步
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
|
最后说一句:IntelliJ IDEA:2018.2.x已全面支持JDK11。
评论