Java11 部分新特性一览

9月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

  • Stream lines();

一次性将字符串按照换行符分割并返回所有行的流

1
2
3
4
5
6
7
var content = "hello\nworld\njava11";
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

  • 增加ofNullable, 可以传入null了。
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

InputStream API

使用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。

# Java

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×