认识一下 Java 11

2018 年 10 月 1 日 性能与架构

可能很多人现在 Java8 的新特性还没用熟呢,Java 11 就已经来了,下面一起来看下 Java 11 的几个新特性:

  • var 类型

  • Strings 的几个便利方法

  • 集合的便利方法

  • Streams

  • InputStreams

  • HTTP Client

var 类型

Java 10 引入一个新的关键字 var,当声明本地变量时可以替代类型信息(“本地变量”指的是方法体中声明的变量)。

在 Java 10 以前,声明变量是这样的:

  
  
    
  1. String text = "Hello Java 9";

现在可以使用 var 代替 String,编译器会自动推断出准确的类型,在上面的代码中 text 就是 String 类型:

  
  
    
  1. var text = "Hello Java 10";

需要注意,使用 var 可不表示动态类型,还是静态的,类型是不能重新改变的,例如下面的用法就是无法编译的:

  
  
    
  1. var text = "Hello Java 11";

  2. text = 23;  // 无法编译

而且,变量的类型不明确时是不能使用 var 声明的,例如下面的代码就是错误的:

  
  
    
  1. var a;

  2. var nothing = null;

  3. var lambda = () -> System.out.println("Pity!");

  4. var method = this::someMethod;

那么 var 有什么好处呢?我感觉它最大的好处就是简化代码,例如:

  
  
    
  1. var myList = new ArrayList<Map<String, List<Integer>>>();

  2. for (var current : myList) {

  3.    System.out.println(current);

  4. }

current 的类型就是 Map<String,List<Integer>>,是不是简单了不少。

Strings 的几个便利方法

  
  
    
  1. " ".isBlank();                // true

  2. " Foo Bar ".strip();          // "Foo Bar"

  3. " Foo Bar ".stripTrailing();  // " Foo Bar"

  4. " Foo Bar ".stripLeading();   // "Foo Bar "

  5. "Java".repeat(3);             // "JavaJavaJava"

  6. "A\nB\nC".lines().count();    // 3

集合的便利方法

ListSetMap 都有了新的方法。

List.of 可以根据给定的参数创建一个不变列表List.copyOf 可以创建一个不变列表的复本。

  
  
    
  1. var list = List.of("A", "B", "C");

  2. var copy = List.copyOf(list);

  3. System.out.println(list == copy);   // true

因为 listList.of 创建出来的不变列表,已经是不变的了,那么没必要再创建一个实例,所以 listcopy 是同一个实例。但如果要 copy 一个可变的列表, copy 就是一个真实的实例:

  
  
    
  1. var list = new ArrayList<String>();

  2. var copy = List.copyOf(list);

  3. System.out.println(list == copy);   // false

Map.of 可以创建一个不变的Map:

  
  
    
  1. var map = Map.of("A", 1, "B", 2);

  2. System.out.println(map);    // {B=2, A=1}

Streams

Streams 是 Java 8 引入的,现在有了3个新的方法:

  
  
    
  1. // ofNullable

  2. Stream.ofNullable(null)

  3.    .count()   // 0

  4. // dropWhile

  5. Stream.of(1, 2, 3, 2, 1)

  6.    .dropWhile(n -> n < 3)

  7.    .collect(Collectors.toList());  // [3, 2, 1]

  8. // takeWhile

  9. Stream.of(1, 2, 3, 2, 1)

  10.    .takeWhile(n -> n < 3)

  11.    .collect(Collectors.toList());  // [1, 2]

InputStreams

InputStream 有了一个非常方便的方法,可以直接传输数据到 OutputStream,例如:

  
  
    
  1. var classLoader = ClassLoader.getSystemClassLoader();

  2. var inputStream = classLoader.getResourceAsStream("myFile.txt");

  3. var tempFile = File.createTempFile("myFileCopy", "txt");

  4. try (var outputStream = new FileOutputStream(tempFile)) {

  5.    inputStream.transferTo(outputStream);

  6. }

HTTP Client

Java 9 引入了 HttpClient API,在 Java 11 中终于可用了,在 java.net 包下。

HttpClient 可以同步,也可以异步。

同步方式:

  
  
    
  1. var request = HttpRequest.newBuilder()

  2.    .uri(URI.create("https://winterbe.com"))

  3.    .GET()

  4.    .build();

  5. var client = HttpClient.newHttpClient();

  6. // BodyHandlers 定义响应体的期望类型,例如 string、byte-array、file

  7. HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

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

异步方式:

  
  
    
  1. var request = HttpRequest.newBuilder()

  2.    .uri(URI.create("https://winterbe.com"))

  3.    .build();

  4. var client = HttpClient.newHttpClient();

  5. client.sendAsync(request, HttpResponse.BodyHandlers.ofString())

  6.    .thenApply(HttpResponse::body)

  7.    .thenAccept(System.out::println);

POST请求:

  
  
    
  1. var request = HttpRequest.newBuilder()

  2.    .uri(URI.create("https://postman-echo.com/post"))

  3.    .header("Content-Type", "text/plain")

  4.    .POST(HttpRequest.BodyPublishers.ofString("Hi there!"))

  5.    .build();

  6. var client = HttpClient.newHttpClient();

  7. var response = client.send(request, HttpResponse.BodyHandlers.ofString());

  8. System.out.println(response.statusCode());      // 200

BASIC-AUTH 认证:

  
  
    
  1. var request = HttpRequest.newBuilder()

  2.    .uri(URI.create("https://postman-echo.com/basic-auth"))

  3.    .build();

  4. var client = HttpClient.newBuilder()

  5.    .authenticator(new Authenticator() {

  6.        @Override

  7.        protected PasswordAuthentication getPasswordAuthentication() {

  8.            return new PasswordAuthentication("postman", "password".toCharArray());

  9.        }

  10.    })

  11.    .build();

  12. var response = client.send(request, HttpResponse.BodyHandlers.ofString());

  13. System.out.println(response.statusCode());      // 200

小结

本文翻译整理自:

https://winterbe.com/posts/2018/09/24/java-11-tutorial/

先介绍这些,以后发现好用新特性时再分享。

点击下面的 “阅读原文” 查看 历史文章列表

登录查看更多
0

相关内容

Java 是一门编程语言,拥有跨平台、面向对象、泛型编程等特性。
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
107+阅读 · 2020年5月9日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
34+阅读 · 2020年4月5日
自动结构变分推理,Automatic structured variational inference
专知会员服务
38+阅读 · 2020年2月10日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
知识图谱本体结构构建论文合集
专知会员服务
102+阅读 · 2019年10月9日
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
推荐一些适合小白练手的Python项目
数据挖掘入门与实战
6+阅读 · 2018年5月17日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
干货| PyTorch相比TensorFlow,存在哪些自身优势?
全球人工智能
15+阅读 · 2017年10月4日
干货|7步让你从零开始掌握Python机器学习!
全球人工智能
8+阅读 · 2017年9月24日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Arxiv
6+阅读 · 2018年11月1日
Arxiv
3+阅读 · 2018年4月5日
VIP会员
相关VIP内容
【实用书】Python技术手册,第三版767页pdf
专知会员服务
229+阅读 · 2020年5月21日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】R语言书: 编程和统计的第一课程,
专知会员服务
107+阅读 · 2020年5月9日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
34+阅读 · 2020年4月5日
自动结构变分推理,Automatic structured variational inference
专知会员服务
38+阅读 · 2020年2月10日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
机器学习入门的经验与建议
专知会员服务
90+阅读 · 2019年10月10日
知识图谱本体结构构建论文合集
专知会员服务
102+阅读 · 2019年10月9日
相关资讯
实战 | 用Python做图像处理(三)
七月在线实验室
15+阅读 · 2018年5月29日
推荐一些适合小白练手的Python项目
数据挖掘入门与实战
6+阅读 · 2018年5月17日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
干货| PyTorch相比TensorFlow,存在哪些自身优势?
全球人工智能
15+阅读 · 2017年10月4日
干货|7步让你从零开始掌握Python机器学习!
全球人工智能
8+阅读 · 2017年9月24日
代码这样写不止于优雅(Python版)
数说工作室
4+阅读 · 2017年7月17日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Top
微信扫码咨询专知VIP会员