Java10、Java11新特性

1. JDK10之局部变量类型推断var讲解

  • Java是⼀种强类型, 许多流⾏的编程语⾔都已经⽀持局部变量类型推断,如js,Python,C++等
  • JDK10 可以使⽤var作为局部变量类型推断标识符
  • Local-Variable Type Inference(局部变量类型推断),顾名思义只能⽤做为局部变量
  • 注意仅适⽤于局部变量,如 增强for循环的索引,传统for循环局部变量
  • 不能使⽤于⽅法形参、构造函数形参、⽅法返回类型或任何其他类型的变量声明
  • 标识符var不是关键字,⽽是⼀个保留类型名称,⽽且不⽀持类或接⼝叫var,也不符合命名规范
//根据推断为 字符串类型
 var strVar = "springboot";
 System.out.println(strVar instanceof String);

 //根据10L 推断long 类型
 var longVar = 10L;
 //根据 true推断 boolean 类型
 var flag = true;
 //var flag = Boolean.valueOf("true");
 //System.out.println(flag instanceof Boolean);
 // 推断 ArrayList<String>
 var listVar = new ArrayList<String>();
 System.out.println(listVar instanceof ArrayList);

 // 推断 Stream<String>
 var streamVar = Stream.of("aa", "bb", "cc");
 System.out.println(streamVar instanceof Stream);
 if(flag){
 System.out.println("这个是 flag 变量,值为true");
 }
 for (var i = 0; i < 10; i++) {
 System.out.println(i);
 }

 try (var input = new FileInputStream("validation.txt")) {
 }

2. JDK11新增Http客户端

  • 这个功能在JDK 9中引⼊并在JDK 10中得到了更新最终JDK11正式发布,⽀持 HTT/1.1, HTTP/2
    官⽅⽂档 http://openjdk.java.net/jeps/321

  • 常⽤类和接⼝讲解

    • HttpClient.Builder
      HttpClient 构建⼯具类
    • HttpRequest.Builder
      HttpRequest 构建⼯具类
    • HttpRequest.BodyPublisher
      将java 对象转换为可发送的HTTP request body字节流, 如form表单提交
    • HttpResponse.BodyHandler
      处理接收到的 Response Body
  • 创建HttpClient, 下⾯结果是⼀致的底层调⽤

 //var httpClient = HttpClient.newBuilder().build();
 var httpClient = HttpClient.newHttpClient();
  • 创建get请求
//private static final String targetUrl =
"http://api.xdclass.net/pub/api/v1/web/all_category";
 private static final URI uri = URI.create(targetUrl);

 //GET请求
 private static void testGet() {
 //var httpClient = HttpClient.newHttpClient();
 //设置建⽴连接超时 connect timeout
 var httpClient =
HttpClient.newBuilder().connectTimeout(Duration.ofMillis(5000)).build();
 //设置读取数据超时 read timeout
 var request =
HttpRequest.newBuilder().timeout(Duration.ofMillis(3000))
 .header("key1", "v1")
 .header("key2", "v2")
 .uri(uri).build();
 try {
 var response = httpClient.send(request,
 HttpResponse.BodyHandlers.ofString());
 System.out.println(response.body());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
  • POST请求
private static final String targetUrl
="https://api.xdclass.net/pub/api/v1/web/web_login";
private static final URI uri = URI.create(targetUrl);
//POST请求
 private static void testPost() {
 var httpClient = HttpClient.newHttpClient();
 var request = HttpRequest.newBuilder()
 .uri(uri)
 //json格式则使⽤下⾯数据
 //.header("Content-Type", "application/json")
 //.POST(HttpRequest.BodyPublishers.ofString("
{\"phone\":\"13113777337\",\"pwd\":\"1234567890\"}"))
 //form表单则使⽤下⾯配置
 .header("Content-Type", "application/x-www-formurlencoded")

.POST(HttpRequest.BodyPublishers.ofString("phone=13113777337&pwd=1234567
890"))
 .build();
 try {
 var response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
 System.out.println(response.body());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
  • 使⽤HttpClient提交异步GET请求
 //异步GET请求
 //private static final String targetUrl =
"http://api.xdclass.net/pub/api/v1/web/all_category";
 private static final URI uri = URI.create(targetUrl);
 //异步请求通过CompletableFuture实现。
 private static void testAsynGet() {
 var httpClient = HttpClient.newBuilder().build();
 var request =
HttpRequest.newBuilder().timeout(Duration.ofMillis(3000))
 .header("key1", "v1")
 .header("key2", "v2")
 .uri(uri).build();
 try {
//CompletableFuture<String> result = httpClient.sendAsync(request,
HttpResponse.BodyHandlers.ofString()).thenApply(HttpResponse::body);
var result = httpClient.sendAsync(request,
HttpResponse.BodyHandlers.ofString())
 .thenApply(HttpResponse::body);
 System.out.println(result.get());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
  • http2.0
private static final String targetUrl = "https://http2.akamai.com/demo";
private static final URI uri = URI.create(targetUrl);
private static void testHttp2() {
 var httpClient = HttpClient.newBuilder()
 .connectTimeout(Duration.ofMillis(3000))
 .version(HttpClient.Version.HTTP_2)
 .build();
 var request = HttpRequest.newBuilder()
 .timeout(Duration.ofMillis(3000))
 .header("key1", "v1")
 .header("key2", "v2")
 .uri(uri)
 .build();
 try {
 var response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
 System.out.println(response.body());
 System.out.println(response.version());
 } catch (Exception e) {
 e.printStackTrace();
 }
 }

JDK11之javac和java命令优化

  • jdk11前运⾏java程序
  • 编译
    javac xxx.java
  • 运⾏
    java xxx
  • jdk11后运⾏java程序(本地不会⽣成class⽂件)
    java xxxx.java

猜你喜欢

转载自blog.csdn.net/lin819747263/article/details/102750860