使用示例带你提前了解 Java 9 中的新特性
使用示例带你提前了解 Java 9 中的新特性
转载来源:https://juejin.im/post/58c5e402128fe100603cc194
英文出处:https://www.journaldev.com/13121/java-9-features-with-examples
Oracle 公司即将在 2017 年 3 月底正式发布 Java SE 9。在这篇文章,我将使用一些示例简明扼要地阐述 Java 9 的新特性。当然,也是时候去了解一下。
1. Java 9 PEPK(JShell)
Oracle 公司(Java Library 开发者)新引进一个代表 Java Shell 的称之为 “jshell” 或者 REPL(Read Evaluate Print Loop)的新工具。该工具可以被用来执行和测试任何 Java 中的结构,如 class,interface,enum,object,statements 等。使用非常简单。
JDK 9 EA(Early Access)下载地址:jdk9.java.net/download/
G:\>jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell> int a = 10
a ==> 10
jshell> System.out.println("a value = " + a )
a value = 10
有关 REPL 工具的更多信息,可访问 Java 9 REPL Basics (Part-1) 和 Java 9 REPL Features (Part-2).
2. 不可变集合类的工厂方法
Oracle 公司引入一些方便使用的工厂方法,用于创建不可变集合 List,Set,Map 和 Map.Entry 对象。这些高效实用的方法可用来创建空或者非空集合对象。
在 Java SE 8 和更早版本中,我们常用类似 unmodifiableXXX 的集合类方法创建不可变集合对象。举个例子,比如我们想创建一个不可变的 List 对象,可能使用到Collections.unmodifiableList
方法。
然而,这些 Collections.unmodifiableXXX
方法显得非常冗长乏味。为了克服这些缺陷,Oracle 公司给 List、Set 和 Map 接口分别添加了两个更加实用的方法。
List 和 Set 接口使用 of()
方法创建一个空或者非空的不可变 List 或 Set 对象,如:
空 List 示例
List immutableList = List.of();
非空 List 示例
List immutableList = List.of("one","two","three");
Map 分别有两个方法用于创建不可变 Map 对象和不可变 Map.Entry 对象:of()
和 ofEntries()
。
空 Map 示例
jshell> Map emptyImmutableMap = Map.of()
emptyImmutableMap ==> {}
非空 Map 示例
jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
更多有关这些实用方法的信息,可以通过这些链接查询:
- Java 9 Factory Methods for Immutable List
- Java 9 Factory Methods for Immutable Set
- Java 9 Factory Methods for Immutable Map and Map.Entry
3. 接口中的私有方法
在 Java 8 中,我们可以在接口中使用默认或者静态方法提供一些实现方式,但是不能创建私有方法。
为了避免冗余代码和提高重用性,Oracle 公司准备在 Java SE 9 接口中引入私有方法。也就是说从 Java SE 9 开始,我们也能够在接口类中使用 ‘private’ 关键字写私有化方法和私有化静态方法。
接口中的私有方法与 class 类中的私有方法在写法上并无差异,如:
public interface Card{
private Long createCardID(){
// Method implementation goes here.
}
private static void displayCardDetails(){
// Method implementation goes here.
}
}
有关接口私有方法新特性的更多信息,可访问我的初体验之:Java 9 Private methods in Interface。
4. Java 9 Module System
Java 9 新特性中最大的一个变化就是 Module System。Oracle 公司将引入如下特性作为 Jigsaw Project 的一部分:
- Modular JDK
- Modular Java Source Code
- Modular Run-time Images
- Encapsulate Java Internal APIs
- Java Platform Module System
Java SE 9 版本之前,我们使用 Monolithic Jars 来开发基于 Java 语言的应用程序。这种体系架构有许多局限性和缺点。为了避免这些缺陷,Java SE 9 迎来了 Module System。
JDK 9 包含有 92 个 modules(当然也可能在最终发布版中有所变化)。我们可以使用 JDK Modules,也能创建我们自己的 modules,如:
简单 Module 示例
module com.foo.bar { }
这里我们使用 module
关键字创建了一个简单的 module。每个 module 都有一个名字,对应代码和其它一些资源。
想了解更多有关这个新体系架构和亲自动手体验的话,可以参考这里我的体验之:
- Java 9 Module System Basics
- Java 9 Module System Examples
5. Process API Improvements
Java SE 9 迎来一些 Process API 的改进,通过添加一些新的类和方法来优化系统级进程的管控。
Process API 中的两个新接口:
- java.lang.ProcessHandle
- java.lang.ProcessHandle.Info
Process API 示例
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("Current Process Id: = " + currentProcess.getPid());
想了解更多新 API 的信息,可以通过参考我的初体验之:Java SE 9: Process API Improvements。
6. Try With Resources Improvement
我们知道,Java SE 7 引入了一个新的异常处理结构:Try-With-Resources
,来自动管理资源。这个新的声明结构主要目的是实现“Automatic Better Resource Management”(“自动资源管理”)。
Java SE 9 将对这个声明作出一些改进来避免一些冗长写法,同时提高可读性。
Java SE 7 示例
void testARM_Before_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (BufferedReader reader2 = reader1) {
System.out.println(reader2.readLine());
}
}
Java SE 9 示例
void testARM_Java9() throws IOException{
BufferedReader reader1 = new BufferedReader(new FileReader("journaldev.txt"));
try (reader1) {
System.out.println(reader1.readLine());
}
}
有关这个特性的更多信息,可以参考我的初体验之:Java 9 Try-With-Resources Improvements
7. CompletableFuture API Improvements
在 Java SE 9 中,Oracle 公司将改进 CompletableFuture API 来解决一些 Java SE 8 中出现的问题。这些被添加的 API 将用来支持一些延时和超时操作,实用方法和更好的子类化。
Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
这里的 delayedExecutor() 是静态实用方法,用来返回一个在指定延时时间提交任务到默认执行器的新 Executor 对象。
有关这个特性的更多信息,请访问我的初体验之:Java SE 9: CompletableFuture API Improvements。
8. Reactive Streams
现在,Reactive Programming 由于其便利性在应用程序开发中变得非常流行。Scala、Play、Akka 等框架已经集成 Reactive Streams 并且受益良多。Oracle 公司也在 Java SE 9 中引入了一个新的 Reactive Streams API。
Java SE 9 Reactive Streams API 是一个发布订阅型框架,使我们能够非常简单地使用 Java 语言就能实现异步的、可拓展的和并行的应用。
Java SE 9 引进下面这些 API 来在基于 Java 语言的应用中开发 Reactive Streams:
- java.util.concurrent.Flow
- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Processor
如果你想了解这个新 API 的更多信息,可以参考我的初体验之:Introduction to Reactive Programming and Java SE 9: Reactive Streams。
9. Diamond Operator for Anonymous Inner Class
我们知道,Java SE 7 引入了一个新的特性:Diamond Operator,来避免冗长代码和提升可读性。然而在 Java SE 8 中,Oracle 公司发现在 Diamond 操作器和匿名内部类的使用中存在一些局限性,后来修复了这些问题并准备将其作为 Java 9 的一部分发布出去。
public List getEmployee(String empid){
// Code to get Employee details from Data Store
return new List(emp){ };
}
10. Optional Class Improvements
在 Java SE 9 中,Oracle 公司添加了一些新的实用方法到 java.util.Optional
类里面。这里我将使用一些简单的示例来描述其中的一个:stream 方法。
如果一个值出现在给定 Optional 对象中,stream() 方法可以返回包含该值的一个顺序 Stream 对象。否则,将返回一个空 Stream。
stream()
方法已经被添加,并用来在 Optional 对象中使用,如:
Stream<Optional> emp = getEmployee(id)
Stream empStream = emp.flatMap(Optional::stream)
这里的 Optional.stream()
方法被用来转化 Employee 可选流对象 到 Employee 流中,如此我们便可以在后续代码中使用这个结果。
理解这个特性的更多信息,可参考我的初体验过程:Java SE 9: Optional Class Improvements。
11. Stream API Improvements
在 Java SE 9 中,Oracle 公司添加了四个非常有用的新方法到 java.util.Stream
接口里面。正如 Stream 作为一个接口类,所有这些新的实现方法都是默认方法。其中有两个方法非常重要:dropWhile 和 takeWhile。
如果你熟悉 Scala 语言或者其它函数编程语言的话,你一定知道这些方法。他们在写一些功能样式代码时非常有用。这里我们一起讨论一下 takeWhile 实用方法。
这个 takeWhile()
方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。
jshell> Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 5 )
.forEach(System.out::println);
1
2
3
4
更多有关 takeWhile、dropWhile 和其它新方法的信息,可以参考我的初体验过程之:Java SE 9: Stream API Improvements。
12. Enhanced @Deprecated annotation
在 Java SE 8 和更早版本上,@Deprecated 注解只是一个没有任何方法的标记类接口。它的作用是标记一个 Java API,可以是 calss,field,method,interface,constructor 等。
在 Java SE 9 中,Oracle 公司强化了 @Deprecated 注解,来提供更多有关废弃 API 的介绍信息,同时也提供一个工具来分析项目中的废弃 API 的静态使用情况。Oracle 公司添加了两个方法到 Deprecated 接口中来提供服务:forRemoval 和since。
13. HTTP 2 Client
在 Java SE 9 中,Oracle 公司将发布新的 HTTP 2 Client API 来支持 HTTP/2 协议和 WebSocket 特性。现有的 HTTP Client API 存在很多问题(如支持 HTTP/1.1 协议但是不支持 HTTP/2 协议和 WebSocket,仅仅作用在 Blocking 模式中,并存在大量性能问题),他们正在被使用新的 HTTP 客户端的 HttpURLConnection API 所替代。
Oracle 公司准备在 “java.net.http” 包下引入新的 HTTP 2 Client API。它将同时支持 HTTP/1.1 和 HTTP/2 协议,也同时支持同步(Blocking Mode)和异步模式,支持 WebSocket API 使用中的异步模式。
我们可以在这里查看这个新 API 信息:download.java.net/java/jdk9/d…。
HTTP 2 Client 示例
jshell> import java.net.http.*
jshell> import static java.net.http.HttpRequest.*
jshell> import static java.net.http.HttpResponse.*
jshell> URI uri = new URI("http://rams4java.blogspot.co.uk/2016/05/java-news.html")
uri ==> http://rams4java.blogspot.co.uk/2016/05/java-news.html
jshell> HttpResponse response = HttpRequest.create(uri).body(noBody()).GET().response()
response ==> java.net.http.HttpResponseImpl@79efed2d
jshell> System.out.println("Response was " + response.body(asString()))
可以通过我的初体验之:Java SE 9: HTTP 2 Client,理解 HTTP/2 协议和 WebSocket,以及使用一些有用的示例对比新 API 的优势和旧 OLD API 的缺陷。
14. Мulti-Resolution Image API
在 Java SE 9 中,Oracle 公司将引入一个新的 Мulti-Resolution Image API。这个 API 中比较重要的接口是
,在
MultiResolutionImagejava.awt.image
包下可获取到。
MultiResolutionImage
封装不同高度和宽度图片(不同解决方案)到一个集合中,并允许我们按需查询使用。
想理解这个 API 的更多信息,可参考我的初体验之:Java SE 9: Мulti-Resolution Image API。
15. Miscellaneous Java 9 Features
在这个部分,我将列出 Java SE 9 新特性中其它一些内容。当然,这并不是这些内容就不重要。使用一些示例去理解他们也是非常重要并且很实用的。
截至目前,我并没有获取到这些特性的足够多信息。这就是为什么我将他们简单列举至此的原因。我也会一个一个去获取信息并采用一些示例来说明这个部分列举的特性内容。并且会在晚些写成一个独立的体验部分。
- GC (Garbage Collector) Improvements
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate the Applet API
- Indify String Concatenation
- Enhanced Method Handles
- Java Platform Logging API and Service
- Compact Strings
- Parser API for Nashorn
- Javadoc Search
- HTML5 Javadoc
后面我将逐个搜集这些 java 9 中的特性,并使用足够的描述性文字和示例代码予以解释。
至此,上述就是 java 9 中所有新引进的特性,一些简介和示例代码。
使用示例带你提前了解 Java 9 中的新特性的更多相关文章
- JAVA JDK1.5-1.9新特性
1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...
- Java学习之==>Java8 新特性详解
一.简介 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.Java 8是 Java 自 Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库. ...
- 一文带你看遍 JDK9~14 的重要新特性!
Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...
- Java 各个版本中的新特性
新特性你知道多少? Java 8 Lambda 表达式 接口增加默认方法等 方法引用 流 Stream Java 9 模块系统 交互式工具jshell .of() 创建不可变集合 接口支持私有方法 更 ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- Java 8 正式发布,新特性全搜罗
经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...
- Java引入的一些新特性
Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...
- Java语言中的面向对象特性:封装、继承、多态,面向对象的基本思想(总结得不错)
Java语言中的面向对象特性(总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知道jav ...
- Java Servlet 3.0 新特性
Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...
随机推荐
- metabase docker-compose 运行说明
metabase 是一款比较产品化的一个数据分析工具,支持的数据源也比较多 以下为简单的docker-compose 运行文件,同时集成了mongo 以及graphql 引擎,方便数据 的api查询 ...
- apache spark kubernets 部署试用
spark 是一个不错的平台,支持rdd 分析stream 机器学习... 以下为使用kubernetes 部署的说明,以及注意的地方 具体的容器镜像使用别人已经构建好的 deploy yaml 文件 ...
- TweenMax.allTo
需要多个MC进行相同的缓动.比如下面这个游戏菜单.三个按钮的缓动是相同的,都缓动到同一个x坐标位置.然后同时有缓动出舞台. 如果有TweenLite实现的话,需要 if (is ...
- Java性能分析之线程栈详解与性能分析
Java性能分析之线程栈详解 Java性能分析迈不过去的一个关键点是线程栈,新的性能班级也讲到了JVM这一块,所以本篇文章对线程栈进行基础知识普及以及如何对线程栈进行性能分析. 基本概念 线程堆栈也称 ...
- zmediaboard-Hi3518参数及配置
1.12_13.uboot的烧写和flash分区1_21.12.1.裸机烧录uboot(1)什么叫裸机烧录?设备是空白的,未经烧录的,就叫裸机.(2)裸机烧录一个设备有2种方案:1是用外部烧录器来烧录 ...
- virtualbox centos安装增强工具和问题详解
virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...
- 如何用Photoshop画一个发光金币(unity游戏素材教程)
做好的发光金币预览图: 以下为如何用Photoshop画一个发光金币教程: [1]如上图1-2,新建,名称改为Coin,宽度20像素,高度20像素,分辨率72,背景白色: [2]使用Alt+Shift ...
- Win7 搭建pptpvpn服务器方法
打开网络与共享中心 选择更改适配器设置 选择菜单文件选项(若无菜单栏,可以按一下alt键就会显示出来的) 选择新建传入链接 选择需要哪些用户可以访问vpn服务器,把勾搭上,点击下一步 注意此处的通过i ...
- js去除运营商或者路由器添加的广告脚本
是不是偶尔发现在家里看网页的时候回插入一个广告,很烦人.开发的网站,上传到了阿里云 oss,设置了域名解析,但是在家里晚上访问的时候,总会在页面添加一个广告,导致页面卡主,一开始以为是路由器的问题,以 ...
- 用exec调用带有output输出参数的存储过程
用exec调用带有output输出参数的存储过程,想要得到输出参数的值,必须在调用参数后面加output关键字,如: declare @value int exec up_test 2,3,@v ...