• 在目前,比较主流的稳定版Java 8Java 11(Java 9,10 非稳定版)
  • Java 11相比Java 8进化了一部分(有些是 Java 9,10 时已引入)

Java 11 新特性有哪些?

1. 变量类型 var

  • 引入了 var
1
2
3
4
5
6
7
8
9
10
// 普通变量
var name = "paper";

// 集合
var list1 = List.of(1, 2, 3);
var list2 = List.of(4, 5, 6);
var list3 = List.of(7, 8, 9);

// List<List<T>> 嵌套
var list = List.of(list1, list2, list3);
  • var 不能使用的情况,如下:
    1. 重新赋值另一种类型
      1
      2
      var name = "paper";	// String 类型
      name = 666; // int 类型
    2. 没有初始化
      1
      2
      var age;
      age = 22;
    3. 类的成员变量
    4. 方法入参类型
    5. 返回值类型

2. HTTP Client 加持

  • 位于 java.net.http 包下
  • 支持发送同步异步请求,还可以带上自定义请求头(ex:携带 JWT Token 权限信息去请求)
  • 发送同步请求
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var request = HttpRequest.newBuilder()
    .uri(URI.create("https://paper00.github.io/"))
    .GET()
    .build();

    var response = httpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());

    System.out.println(response);
  • 发送异步请求
    1
    2
    3
    4
    5
    CompletableFuture<String> future = HttpClient.newHttpClient()
    .sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body);
    System.out.println("先做别的事情");
    System.out.println(future.get());
  • 可以带自定义请求头
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var request = HttpRequest.newBuilder()
    .uri(URI.create("https://paper00.github.io/"))
    .header("Authorization", "Bearer eysdjEqoeiwQWeiowoQoieWruqoweE")
    .GET()
    .build();

    var response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());

    System.out.println(response.body());

3. String 处理增强

  • isBlank()
  • strip() - 去空格
  • repeat(7)

4. 集合增强

of() - 创建集合
copyOf() - 复制集合

1
2
3
4
5
6
7
8
var list = List.of(1, 2, 3);
var list0 = List.copyOf(list);

var set = Set.of(1, 2, 3);
var set0 = Set.copyOf(set);

var map = Map.of(1, 2, 3);
var map0 = Map.copyOf(map);

5. 函数上编程增强

Stream 流中的

  • takeWhile()
  • dropWhile()
1
2
3
4
5
var list = List.of(1, 2, 3);
var list0 = list.stream()
.dropWhile(item -> item.equals(1)) // 条件
.collect(Collectors.toList());
System.out.println(list0); // 2, 3

6. 文件读写增强

Files 类

  • writeString()
  • readString()

InputStream 类

  • transferTo()

支持直接通过字符串String类读取写入

1
2
3
4
5
6
// 读取
Path path = Paths.get("/Users/paper/test.txt");
String content = Files.readString(path, StandardCharsets.UTF_8);
// 写入
String str = "abc";
Files.writeString(path, str, StandardCharsets.UTF_8);

7. 支持 .java 源文件直接运行!

  • 省去以前 javac 编译源文件过程,可以直接通过java 指令运行 .java 源文件
    1
    java hello.java
    python源文件的运行有点像