你好啊,我是大阳,本文给你介绍Java11的新特性,并提供一些代码示例。

本文主要内容

  • HTTP客户端API
  • 无需编译即可启动单文件程序
  • 字符串API更新
  • Collection.toArray
  • Files.readString() 和 Files.writeString()
  • Optional.isEmpty()

Java 11(2018 年 9 月发布)包含许多重要且有用的更新。让我们看看它为开发人员和架构师带来的新功能和改进。

1. HTTP客户端API

Java 使用HttpURLConnection进行HTTP通信已经很长一段时间了。但随着时间的推移,要求变得越来越复杂,应用程序的要求也越来越高。在 Java 11 之前,开发人员不得不求助于功能丰富的库,如Apache HttpComponentsOkHttp等。

我们看到Java 9发布包含一个HttpClient实现作为实验性功能。它随着时间的推移而发展,现在是 Java 11 的最终功能。现在 Java 应用程序可以进行 HTTP 通信,而无需任何外部依赖。

1.1 如何使用HttpClient

java.net.http模块和典型 HTTP 交互如下所示 :

  • 创建HttpClient的实例并根据需要进行配置。
  • 创建一个HttpRequest实例并填充信息。
  • 将请求传递给客户端,执行请求并检索HttpResponse的实例。
  • 处理包含在HttpResponse中的信息.

HTTP API 可以处理同步和异步通信。让我们看一个简单的例子。

1.2 同步请求示例

请注意 http 客户端 API 如何使用构建器模式来创建复杂对象。

package cn.dayangshuo.http;import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;/*** @author DAYANG*/
public class HttpClientTest {public static void main(String[] args) {HttpClient httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build();try {String urlEndpoint = "https://www.baidu.com/s";URI uri = URI.create(urlEndpoint + "?wd=java11");HttpRequest request = HttpRequest.newBuilder().uri(uri).build();HttpResponse<String> response = httpClient.send(request,HttpResponse.BodyHandlers.ofString());System.out.println("Status code: " + response.statusCode());System.out.println("Headers: " + response.headers().allValues("content-type"));System.out.println("Body: " + response.body());} catch (IOException | InterruptedException e) {throw new RuntimeException(e);}}
}

1.3 异步请求示例

如果我们不想等待响应,异步通信很有用。我们提供回调处理程序,当响应可用时执行。

注意使用sendAsync()方法发送异步请求。

package cn.dayangshuo.http;import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;import static java.util.stream.Collectors.toList;/*** @author DAYANG*/
public class HttpClientTest {public static void main(String[] args) {final List<URI> uris = Stream.of("https://www.baidu.com/","https://www.zhihu.com/people/da-yang-12-48","https://dayangshuo.cn").map(URI::create).collect(toList());HttpClient httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).followRedirects(HttpClient.Redirect.ALWAYS).build();//回调设置CompletableFuture[] futures = uris.stream().map(uri -> verifyUri(httpClient, uri)).toArray(CompletableFuture[]::new);CompletableFuture.allOf(futures).join();}private static CompletableFuture<Void> verifyUri(HttpClient httpClient, URI uri) {HttpRequest request = HttpRequest.newBuilder().timeout(Duration.ofSeconds(5)).uri(uri).build();return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::statusCode).thenApply(statusCode -> statusCode == 200).exceptionally(ex -> false).thenAccept(valid -> {if (valid) {System.out.println("[SUCCESS] Verified " + uri);} else {System.out.println("[FAILURE] Could not " + "verify " + uri);}});}
}

2. 无需编译即可启动单文件程序

传统上,对于我们想要执行的每个程序,我们都需要先编译它。对于用于测试目的的小程序来说,这似乎是不必要的冗长过程。

Java 11 改变了它,现在我们可以执行包含在单个文件中的 Java 源代码,而无需先编译它。

编写一个简单的HelloWorld.java

public class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}
}

要执行上述类,请直接使用java命令运行它:

//控制台
$ java HelloWorld.javaHello World!

请注意,该程序不能使用任何外部依赖除了使用java.base module模块化. 并且程序只能是单文件程序

3. 字符串API更新

3.1 String.repeat(Integer)

此方法只是重复一个字符串n次。它返回一个字符串,其值为重复 N 次的给定字符串的串联。

如果此字符串为空或计数为零,则返回空字符串。

public class HelloWorld {public static void main(String[] args) {String str = "1".repeat(5);//打印出:11111System.out.println(str);  }
}

3.2. String.isBlank()

此方法指示字符串是空的还是仅包含空格。以前,我们一直在用 Apache 的StringUtils.java.

public class HelloWorld {public static void main(String[] args) {"1".isBlank();  //false"".isBlank(); //true"    ".isBlank(); //true}
}

3.3. String.strip()

此方法负责删除头和尾空格。

我们可以通过使用String.stripLeading()仅删除头字符,使用 String.stripTrailing ( )仅删除尾字符。

public class HelloWorld {public static void main(String[] args) {"   hi  ".strip();  //"hi""   hi  ".stripLeading();  //"hi   ""   hi  ".stripTrailing(); //"   hi"}
}

3.4. String.lines()

此方法有助于将多行文本作为Stream处理。

public class HelloWorld {public static void main(String[] args) {String testString = "hello\nworld\nis\nexecuted";List<String> lines = new ArrayList<>();testString.lines().forEach(line -> lines.add(line));assertEquals(List.of("hello", "world", "is", "executed"), lines);}
}

4. Collection.toArray

在 Java 11 之前,将集合转换为数组并不简单。Java 11 使转换更加方便。

public class HelloWorld {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("alex");names.add("brian");names.add("charles");String[] namesArr1 = names.toArray(new String[names.size()]);   //Java 11之前String[] namesArr2 = names.toArray(String[]::new);          //Java 11}
}

5. Files.readString() 和 Files.writeString()

使用这些重载方法,Java 11 旨在减少大量样板代码,从而更容易读取和写入文件。

public class HelloWorld {public static void main(String[] args) {//读取文件内容为字符串URI txtFileUri = getClass().getClassLoader().getResource("helloworld.txt").toURI();String content = Files.readString(Path.of(txtFileUri),Charset.defaultCharset());//把字符串写入文件Path tmpFilePath = Path.of(File.createTempFile("tempFile", ".tmp").toURI());Path returnedFilePath = Files.writeString(tmpFilePath,"Hello World!", Charset.defaultCharset(), StandardOpenOption.WRITE);}
}

6. Optional.isEmpty()

Optional是一个容器对象,它可能包含也可能不包含非空值。如果不存在任何值,则该对象被认为是空的。

isPresent()方法如果值存在则返回true,否则返回false。

isEmpty()方法与isPresent()方法相反,如果存在值则返回false,否则返回true。

所以我们无论如何都不要写否定条件。适当时使用这两种方法中的任何一种。

public class HelloWorld {public static void main(String[] args) {String currentTime = null;assertTrue(!Optional.ofNullable(currentTime).isPresent()); assertTrue(Optional.ofNullable(currentTime).isEmpty());  currentTime = "12:00 PM";assertFalse(!Optional.ofNullable(currentTime).isPresent()); assertFalse(Optional.ofNullable(currentTime).isEmpty());}
}

Java11新特性及代码示例相关推荐

  1. Java10新特性及代码示例

    你好啊,我是大阳,本文主要介绍Java10新特性,并提供一些代码示例.不过Java10的新特性大多数是开发者不关心的内容. Java 9发布后,Java 10 来得非常快.与之前的版本不同,Java ...

  2. Java11新特性(一)——JDK11新特性概述

    序言 关于JDK11,自从去年也就是2018年9月份 Oracle 对外公布--JDK11正式发布以来,博主就跃跃欲试,但是由于项目周期时间紧,一直未果,今年,也就是2019年2月底系统正式上线,博主 ...

  3. Java11新特性(二)——JDK11绿色免安装版环境变量配置教程

    前言 在实际的工作环境中,因为资源有限,一个人在公司,不可能配备多台电脑,所以就不可能有多个环境,但是一个人可能存在于多个项目,例如:在公司里面,尤其在一个大型的国企里面,研发产品生产线有很多条,当研 ...

  4. Java14发布,16大新特性,代码更加简洁明快

    2020/3/17日JDK14正式发版,生产环境用不用再说,赶紧下载下来体验一番.不过据说该版本并不是长期版本,但即使再发布新版本也是在此基础上的. 另外,想体验Java14还是需要一些准备工作的,除 ...

  5. Java11 新特性

    Java 11新特性的详细解释.JDK 11已经于 2018年9月25日正式发布,那么Java 11主要包含哪些新特性呢? JDK 11是Java SE 11平台版本11的开源参考实现,由JSR 38 ...

  6. java11 新特性 详解

    为什么80%的码农都做不了架构师?>>>    引言: 点击-->java10 新特性 详解 点击-->java9 新特性 详解 点击-->java8 新特性 详解 ...

  7. java11新特性_Java11 发布前抓紧掌握这些新特性

    快速回顾 1.Lambda表达式: (参数) -> {主体} Lambda表达式打开了函数式编程爱好者继续使用Java的大门.Lambda表达式需要零个或多个参数,这些参数可以在表达式主体中访问 ...

  8. Java11新特性概览

    一.JShell(java9已经开始支持) 1.类似于python中的求值-打印循环(Read-Evaluaction-Print Loop),目的在与即时结果和反馈 2.java9引入了shell这 ...

  9. C++11中的一些新特性以及代码详解

    C++11新特性 auto decltype 追踪返回类型 类内成员初始化 列表初始化 基于范围的for循环 静态断言 noexcept修饰符 强类型枚举 常量表达式 原生字符串字面值 继承控制 fi ...

  10. Java11新特性一览

    Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一.下边我们看一下JAVA11的新特性 字符串API增强 在Java 11中,针对String的操作进一步得到加强 ...

最新文章

  1. 访问SharePoint站点时,提示:Service Unavailable
  2. otto android,Albert otto
  3. textureview 旋转90度后平铺_轮滑知识 | 单排轮滑的旋转技巧
  4. MemberShip驗證
  5. 黄仁勋把自己做成了虚拟娃娃
  6. C++ Primer 5th笔记(6)chapter6 函数: 参数
  7. Nginx 安装配置【必须把文件到放到机器上】
  8. 工作185:解决vue+el-element二级联动,选项选择后不显示的问题
  9. 【深度学习】Cifar-10-探究不同的改进策略对分类准确率提高
  10. 签约沈腾,易车开启三年品牌计划,穿越车市寒冬
  11. ubuntu中实践操作系统第二章系统调用与课件不同之处
  12. qq影音linux版本下载官网下载软件,QQ for Linux
  13. LD_PRELOAD实现API劫持
  14. 实现类CAD的交互式命令系统
  15. 获取句子迷的经典语录[Python版本]
  16. C/C++ 16进制转IEEE754
  17. redis从入门到入魔
  18. ANDROID XML图像资源文件详细讲解(一)
  19. 计算机采用什么交换技术,计算机 交换技术是什么?
  20. mybatis学习日志一

热门文章

  1. java调色板代码_调色板的代码
  2. Spring Boot ContentNegotiation 内容协商
  3. win10重装,检测到硬盘错误:在MBR硬盘上没有找到可以引导的分区
  4. 2022搜狐校园 情感分析 × 推荐排序 算法大赛
  5. NLP(自然语言处理)基本入门之分词操作
  6. Java开发自学教程!java应届生面试自我介绍
  7. matlab如何画tanx图像,MATLAB画出sinx cosx tanx 图像
  8. 网络安全——网络空间搜索引擎
  9. 启动mongoDB服务
  10. Springboot 406错误