Java 11 Tutorial

参考 https://blog.csdn.net/sihai12345/article/details/82889827

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

Java11已经发布了,我们今天聊聊大家还停留在哪个版本呢?大家对于新版本的迅速的发布有什么想说的呢?

09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本。

我们都知道,前面的几个版本都不是长期支持的,然而,现在发布这个最新的长期支持的版本还是非常有意义的。

Java11也有许多的地方增加了新的功能,当然,也有一些功能删除了。

下面这是java版本的发布日期:

java11也从下面的这些地方更新(下面是官网的截图)

因为Java11已经把Java9和Java10的一些功能也集成到了Java11中,所以,下面我们从一些新的功能介绍一下。

Java 9 -11 引入的新语法和API

本地变量类型推断
Java 10 就已经引入了新关键词var,该关键词可以在声明局部变量的时候替换类型信息。本地(local)是指方法内的变量声明。

Java 10之前,你需要这样声明一个String对象。

String text = "Hello Java 9";

在Java10里头可以使用var替代String,表达式变成这样:

var text = "Hello Java 10";

用var声明的变量仍然是静态类型的。 不兼容的类型无法重新分配给此类变量。 此代码段无法编译:

var text = "Hello Java 11";
text = 23; // Incompatible types

您还可以final结合使用var禁止将变量重新分配给另一个值:

final var text = "Banana";
text = "Joe"; // Cannot assign a value to final variable 'text'

当编译器无法推断出正确的变量类型时,也不允许使用var。 以下所有代码示例都会导致编译器错误:

// Cannot infer type:
var a;
var nothing = null;
var lambda = () -> System.out.println("Pity!");
var method = this::someMethod;

局部变量类型推断可以泛型。 在下一个示例中,Map <String,List >类型,可以将其简化为单个var关键字,从而避免大量样板代码:

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

for (var current : myList) {
// current is infered to type: Map<String, List<Integer>>
System.out.println(current);
}

从Java 11开始,lambda参数也允许使用var关键字:

Predicate<String> predicate = (@Nullable var a) -> true;

提示:在Intellij IDEA中,您可以将鼠标悬停在变量上,同时CMD/CTRL显示变量的感应类型(按键盘爱好者按下CTRL + J)。

HTTP Client
Java 9开始引入HttpClient API来处理HTTP请求。 从Java 11开始,这个API正式进入标准库包(java.net)。 让我们来探索一下我们可以用这个API做些什么。

新的HttpClient可以同步或异步使用。 同步请求会阻止当前线程。 BodyHandlers定义响应体的预期类型(例如,字符串,字节数组或文件):

var request = HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.GET()
.build();
var client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

也可以使用异步来执行相同的请求。 调用sendAsync不会阻止当前线程,而是返回CompletableFuture来进行异步操作。

var request = HttpRequest.newBuilder()
.uri(URI.create("https://winterbe.com"))
.build();
var client = HttpClient.newHttpClient();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);

我们可以省略.GET()调用,因为它是默认的请求方法。

下一个示例通过POST将数据发送到给定的URL。 与BodyHandler类似,您使用BodyPublishers定义作为请求主体发送的数据类型,如字符串,字节数组,文件或输入流:

var request = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/post"))
.header("Content-Type", "text/plain")
.POST(HttpRequest.BodyPublishers.ofString("Hi there!"))
.build();
var client = HttpClient.newHttpClient();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200

最后一个例子演示了如何通过BASIC-AUTH执行授权:

var request = HttpRequest.newBuilder()
.uri(URI.create("https://postman-echo.com/basic-auth"))
.build();
var client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("postman", "password".toCharArray());
}
})
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode()); // 200

Collections
List,Set和Map等集合已经用新方法扩展。 List.of从给定的参数创建了一个新的不可变列表。 List.copyOf创建列表的不可变副本。

var list = List.of("A", "B", "C");
var copy = List.copyOf(list);
System.out.println(list == copy); // true

因为list已经是不可变的,所以实际上不需要实际创建list实例的副本,因此list和副本是相同的实例。 但是,如果你复制一个可变list,那么复制确实会生成一个新实例,因此保证在改变原始list时没有副作用:

var list = new ArrayList<String>();
var copy = List.copyOf(list);
System.out.println(list == copy); // false

创建不可变map时,您不必自己创建map条目,而是将键和值作为参数传递:

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

Java 11中的不可变集合仍然使用Collection API中的老接口。 但是,如果尝试修改不可变集合,则会抛出java.lang.UnsupportedOperationException。 可喜的是,如果尝试改变不可变集合,Intellij IDEA会通过发出警告。

Streams
Streams是在Java 8中引入的,Java 9增加了三个新方法。 单个参数构造方法:

Stream.ofNullable(null)
.count() // 0

增加 takeWhile 和 dropWhile 方法,用于从stream中释放元素:

Stream.of(1, 2, 3, 2, 1)
.dropWhile(n -> n < 3)
.collect(Collectors.toList()); // [3, 2, 1] Stream.of(1, 2, 3, 2, 1)
.takeWhile(n -> n < 3)
.collect(Collectors.toList()); // [1, 2]

如果您还不熟悉Streams,那么您应该阅读我的Java 8 Streams Tutorial

Optionals
Optionals提供了一些非常方便的功能,例如 您现在可以简单地将Optional转换为Stream,或者为空Optinal提供另一个Optional作为备胎:

Optional.of("foo").orElseThrow();     // foo
Optional.of("foo").stream().count(); // 1
Optional.ofNullable(null)
.or(() -> Optional.of("fallback"))
.get(); // fallback

Strings
Java11 给String增加了一些辅助方法来修剪或检查空格等功能:

" ".isBlank();                // true
" Foo Bar ".strip(); // "Foo Bar"
" Foo Bar ".stripTrailing(); // " Foo Bar"
" Foo Bar ".stripLeading(); // "Foo Bar "
"Java".repeat(3); // "JavaJavaJava"
"A\nB\nC".lines().count(); // 3

InputStreams
InputStream增加了transferTo方法,可以用来将数据直接传输到 OutputStream:

var classLoader = ClassLoader.getSystemClassLoader();
var inputStream = classLoader.getResourceAsStream("myFile.txt");
var tempFile = File.createTempFile("myFileCopy", "txt");
try (var outputStream = new FileOutputStream(tempFile)) {
inputStream.transferTo(outputStream);
}

这些上面的新特性只是在前面几个版本有的,或者一些比较觉得不错的新特性,如果还想去了解更多的新特性可以去官网查看(https://docs.oracle.com/en/java/javase/11/)

或者查看下面的链接

[用于反应式编程的Flow API]:https://community.oracle.com/docs/DOC-1006738
[Java模块系统]:https://www.oracle.com/corporate/features/understanding-java-9-modules.html
[应用程序类数据共享]:https://blog.codefx.org/java/application-class-data-sharing/
[动态类文件常量]:http://openjdk.java.net/jeps/309
[Java REPL(JShell)]:https://docs.oracle.com/javase/10/jshell/introduction-jshell.htm#JSHEL-GUID-630F27C8-1195-4989-9F6B-2C51D46F52C8
[飞行记录器]:http://openjdk.java.net/jeps/328
[Unicode 10]:http://openjdk.java.net/jeps/327
[G1:完全并行垃圾收集器]:https://blog.idrsolutions.com/2018/04/java-10-improvements-to-garbage-collection-explained-in-5-minutes/
[ZGC:可扩展的低延迟垃圾收集器]:http://openjdk.java.net/jeps/333
[Epsilon:No-Op垃圾收集器]:http://openjdk.java.net/jeps/318
[弃用Nashorn JavaScript引擎]:http://openjdk.java.net/jeps/335

参考资料:
https://docs.oracle.com/en/java/javase/11/
http://openjdk.java.net/projects/jdk/11/
https://winterbe.com/posts/2018/09/24/java-11-tutorial/
https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html#NewFeature

=============== End

Java 11 Tutorial的更多相关文章

  1. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20

    本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...

  2. Java Arrays Tutorial (3)

    Java Arrays Tutorial (3) Data types have a specific set of values. A byte cannot hold a value larger ...

  3. Java 11 新功能来了!

    关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...

  4. Java 11新功能抢先了解

    目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...

  5. java10.0.2和java 11.0.1配置环境变量

    java10.0.2 在网上找了各种方法一直也没配好打开jak下的lib文件夹发现并没有tools.jar,后经查询jdk-9后就没有了上述.jar文件所以我的配置方法如下 ClASSPATH C:\ ...

  6. java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api

    移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...

  7. java 11 标准Java异步HTTP客户端

    这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到 ...

  8. JAVA 11初体验

    JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...

  9. Java 11 究竟比 8 快了多少?

    阅读本文大概需要 1.2 分钟. 作者:h4cd 来源:开源中国社区 开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版 ...

随机推荐

  1. nginx和tomcat的优化

    测试脚本(服务器414报错)#!/bin/bashurl=http://192.168.4.5/for i in {1..5000}do url=${url}v$i=idoneecho $url #a ...

  2. 自动化测试系列:自动化测试KPI考评的一种方法

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6856204.html 众所周知,在IT ...

  3. UVA11997 K Smallest Sums

    思路 经典的k路归并问题 问题先转换为2路的有序表归并 先让A[1~k]都和B[1]相加,然后加入堆中,取出堆顶(A[x]+B[y])之后,再放入A[x]+B[y+1] 代码 #include < ...

  4. Cordova结合Vue学习Camera

    简单聊两句 学习Vue+Cordova打包编译App,首先你要安装Cordova与vue,在这里本人就不说明了,自行看文档与搜索相关资料. Cordova中文官网地址 Vue中文官网地址 第一步:首先 ...

  5. tensorflow和keras混用

    在tensorflow中可以调用keras,有时候让模型的建立更加简单.如下这种是官方写法: import tensorflow as tf from keras import backend as ...

  6. 【C/C++】泛型栈

    用 C 语言实现泛型栈 mystack.h #ifndef __MYSTACK_H__ #define __MYSTACK_H__ #include <assert.h> // C sty ...

  7. 在Visual Studio 2017中安装bower

    在项目目录下添加一个文件.bowerrc { "directory": "wwwroot/lib" } JS包默认安装到webroot的lib文件夹,可以通过. ...

  8. Java SubString截取字符串

    在String中有两个substring()函数,如下: 一:String.substring(int start) 参数: start:要截取位置的索引 返回: 从start开始到结束的字符串 例如 ...

  9. ID基本操作(在框架内处理文本)5.28

    1.可以直接拖入文档,word,excel,rtf,还可以选中文字,导出文本. 2. 批量把一段文字改为另一段. 还可以改特殊符号.定义范围 . 建立文字后鼠标右键,选择文本框架选项 直接拖动文本框架 ...

  10. day060 ajax文件上传 json补充

    请求头ContentType 文件上传时需要指定请求头,常见的类型有3种: 1.application/x-www-form-urlencoded(可以类比成在url后面拼接的形式发送,即a=1&am ...