Java 11 Tutorial
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的更多相关文章
- 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 ...
- Java Arrays Tutorial (3)
Java Arrays Tutorial (3) Data types have a specific set of values. A byte cannot hold a value larger ...
- Java 11 新功能来了!
关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...
- Java 11新功能抢先了解
目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...
- java10.0.2和java 11.0.1配置环境变量
java10.0.2 在网上找了各种方法一直也没配好打开jak下的lib文件夹发现并没有tools.jar,后经查询jdk-9后就没有了上述.jar文件所以我的配置方法如下 ClASSPATH C:\ ...
- java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api
移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...
- java 11 标准Java异步HTTP客户端
这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到 ...
- JAVA 11初体验
JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...
- Java 11 究竟比 8 快了多少?
阅读本文大概需要 1.2 分钟. 作者:h4cd 来源:开源中国社区 开源规划调度引擎 OptaPlanner 官网发布了一个 Java 11 GC 性能基准测试报告. 当前使用量最大的 Java 版 ...
随机推荐
- linux基础之find
linux上文件查找工具: locate, find locate: 依赖于事先构建的索引,索引的构建在系统较为空闲时自动进行(周期性任务),手动更新数据库(updatedb) 索引构建过程需要遍历整 ...
- 牛客练习赛43C Tachibana Kanade Loves Review
题目地址 Link 题解 虚点这种东西还是没有掌握好啊. 考虑建一个虚点,向已经学会的东西连一条边权为0的边,关系正常连边,单独学的从虚点连一条边过去. 然后做一遍最小生成树就得到答案了. 这题略卡常 ...
- jsp/servlet学习三之会话管理初解
由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...
- CentOS下redis-cli安装
Step1:安装gcc wget等系统lib yum install -y gcc wget Step2:获取redis稳定版并解压 cd /tmp wget http://download.redi ...
- URL URI
URL 是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理 ...
- Spring Boot读取配置的几种方式
读取application文件 在application.yml或者properties文件中添加: info.address=USAinfo.company=Springinfo.degree=hi ...
- ONOS架构-系统组件
系统组件 系统分层 App/core/providers 业务和子系统 一个业务service是有多个组件构成的功能单元,基于各层软件栈提供一个垂直的分片slice,将构成业务service的组件集合 ...
- 获取url "?" 后面的字符串
今天写了一个URL “?” 后面的字符串 来改变当前页面的状态 首先需要获取当前页面的URL console.log(widow.location) 之后页面就会打印出来当前的URL 之后我们获取UR ...
- MongoDB学习笔记——数据库的创建与初始
Part1:MongoDB与SQL的概念对比 图片来源--菜鸟教程 Part2:MongoDB安装地址 直接下载地址:戳这里 备用地址:戳这里 通过备用地址(官网)下载时,要注意下面这个地方 Part ...
- mysql查询今天、昨天、上周
mysql查询今天.昨天.上周 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE ...