Java11 部分新特性一览

2018-09-30

9月26日,Java 11(LTS 长期支持版)如期而至,虽然短期很难投入生产使用(毕竟现在还在用jdk7呢,哈哈哈哈)但是还是非常有必要了解一下相关的特性的。

jshell

使用jshell可以像python交互模式那样直接运行代码

image

编译 && 运行

简化了javac & java命令

javac Test.java
java Test

## jdk 11
java Test.java

局部类型推断

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();

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

var content = "hello\nworld\njava11";
content.lines().collect(Collectors.toList()).forEach(System.out::println);
/**
 * hello
 * world
 * java11
 */
  • String repeat(int count);

将字符串重复N次,如:重要的话说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 方法,它们两个都用来创建不可变的集合

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了。
Stream.ofNullable(null).count(); // 0
  • 增加 takeWhile 和 dropWhile 方法
// 从开始计算,当 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

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了。

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。