Java 9 特性与示例

 

Java 9 特性与示例

 

Java 9是一个主要版本,它为开发人员带来了许多功能。在本文中,我们将详细介绍Java 9的功能。

Java 10已发布,有关Java 10发行版的完整概述,请参阅Java 10 Features。

Java 9功能


一些重要的java 9特性是;

  1. Java 9 REPL(JShell)
  2. 不可变列表,集合,映射和Map.Entry的工厂方法
  3. 接口中的私有方法
  4. Java 9模块系统
  5. 流程API改进
  6. 尝试使用资源改进
  7. CompletableFuture API改进
  8. 反应流
  9. 匿名内部阶级的钻石操作员
  10. 可选的课程改进
  11. 流API改进
  12. 增强的@Deprecated注释
  13. HTTP 2客户端
  14. 多分辨率图像API
  15. 其他Java 9功能

Oracle Corporation将于2017年3月底发布Java SE 9.在这篇文章中,我将简要讨论一下“Java 9 Features”的一些例子。

 

  1. Java 9 REPL(JShell)

    甲骨文公司推出了一款名为“jshell”的新工具。它代表Java Shell,也称为REPL(读取评估打印循环)。它用于非常容易地执行和测试任何Java构造,如类,接口,枚举,对象,语句等。

    我们可以从https://jdk9.java.net/download/下载JDK 9 EA(早期访问)软件

    
    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基础知识(第1部分)和Java 9 REPL功能(第2部分)。

  2. 不可变列表,集合,映射和Map.Entry的工厂方法

    Oracle公司已经引入了一些方便的工厂方法来创建Immutable List,Set,Map和Map.Entry对象。这些实用程序方法用于创建空对象或非空对象。

    在Java SE 8及更早版本中,我们可以使用Collections类实用程序方法unmodifiableXXX来创建Immutable Collection对象。例如,如果我们想创建一个不可变列表,那么我们可以使用Collections.unmodifiableList met,hod。

    然而,这些Collections.unmodifiableXXX方法是非常乏味和冗长的方法。为了克服这些缺点,Oracle公司为List,Set和Map接口添加了几种实用方法。

    List和Set接口有“of()”方法来创建一个空的或不空的Immutable List或Set对象,如下所示:

    空列表示例

    
    List immutableList = List.of();
    

    非空列表示例

    
    List immutableList = List.of("one","two","three");
    

    Map有两组方法:of()方法和ofEntries()方法分别创建一个Immutable Map对象和一个Immutable Map.Entry对象。

    空地图示例

    
    jshell> Map emptyImmutableMap = Map.of()
    emptyImmutableMap ==> {}
    

    非空地图示例

    
    jshell> Map nonemptyImmutableMap = Map.of(1, "one", 2, "two", 3, "three")
    nonemptyImmutableMap ==> {2=two, 3=three, 1=one}
    

    如果您想了解有关这些实用程序方法的更多信息,请浏览以下链接:

    • Java 9不可变列表的工厂方法
    • 不可变集的Java 9工厂方法
    • 用于不可变映射和Map.Entry的Java 9工厂方法
  3. 接口中的私有方法

    在Java 8中,我们可以使用Default和Static方法在Interfaces中提供方法实现。但是我们无法在Interfaces中创建私有方法。

    为避免冗余代码和更多可重用性,Oracle Corp将在Java SE 9接口中引入私有方法。从Java SE 9开始,我们也可以使用'private'关键字在接口中编写私有和私有静态方法。

    这些私有方法只与其他类私有方法一样,它们之间没有区别。

    
    public interface Card{
    
      private Long createCardID(){
        // Method implementation goes here.
      }
    
      private static void displayCardDetails(){
        // Method implementation goes here.
      }
    
    }
    

    如果您想了解有关此新功能的更多信息,请通过以下链接:界面中的Java 9私有方法。

  4. Java 9模块系统

    模块系统是一个重大变化或java 9功能。Oracle公司将在Jigsaw项目中引入以下功能。

    • 模块化JDK
    • 模块化Java源代码
    • 模块化运行时映像
    • 封装Java内部API
    • Java平台模块系统

    在Java SE 9版本之前,我们使用Monolithic Jars来开发基于Java的应用程序。这种架构有很多局限和缺点。为了避免所有这些缺点,Java SE 9将随附Module Module。

    JDK 9将推出92个模块(可能会在最终版本中发生变化)。我们可以使用JDK模块,也可以创建自己的模块,如下所示:

    简单的模块示例

    
    module com.foo.bar { }
    

    这里我们使用'module'来创建一个简单的模块。每个模块都有一个名称,相关代码和其他资源。

    要阅读有关此新架构和实践经验的更多详细信息,请在此处查看我的原始教程:

    • Java 9模块系统基础知识
    • 使用命令提示符的Java 9模块示例
    • 使用Eclipse IDE的Java 9 Hello World模块示例
  5. 流程API改进

    Java SE 9即将在Process API中进行一些改进。他们添加了几个新的类和方法来简化操作系统进程的控制和管理。

    Process API中的两个新的interfcase:

    • 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改进。

  6. 尝试使用资源改进

    我们知道,Java SE 7引入了一种新的异常处理结构:Try-With-Resources自动管理资源。这个新声明的主要目标是“自动更好的资源管理”。

    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 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改进

  7. CompletableFuture API改进

    在Java SE 9中,Oracle公司将改进CompletableFuture API以解决Java SE 8中引发的一些问题。他们将添加以支持一些延迟和超时,一些实用方法和更好的子类。

    
    Executor exe = CompletableFuture.delayedExecutor(50L, TimeUnit.SECONDS);
    

    这里的delayedExecutor()是静态实用程序方法,用于返回一个新的Executor,它在给定的延迟后将任务提交给默认的执行程序。

    要阅读有关此功能的更多信息,请阅读我的原始教程:Java SE 9:CompletableFuture API改进

  8. 反应流

    现在,反应式编程在开发应用程序中变得非常流行,以获得一些美好的好处。Scala,Play,Akka等。框架已经集成了Reactive Streams并获得了许多好处。Oracle Corps还在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

    阅读Java 9 Reactive Streams的更多内容。

  9. 匿名内部阶级的钻石操作员

    我们知道,Java SE 7引入了一项新功能:Diamond Operator,以避免冗余代码和冗长,提高可读性。但是在Java SE 8中,Oracle Corp(Java Library Developer)发现使用Diamond运算符与Anonymous Inner Class有一些限制。他们已经修复了这些问题,并将作为Java 9的一部分发布。

    
      public List getEmployee(String empid){
         // Code to get Employee details from Data Store
         return new List(emp){ };
      }
    

    这里我们只使用“List”而不指定type参数。要阅读有关此改进的更多详细信息,请阅读我的原始教程:Java SE 9:匿名内部类的Diamond操作员改进

  10. 可选的课程改进

    在Java SE 9中,Oracle Corp为java.util.Optional类添加了一些有用的新方法。在这里,我将用一些简单的例子讨论其中一个方法:stream方法

    如果给定Optional对象中存在值,则此stream()方法返回具有该值的顺序Stream。否则,它返回一个空流。

    他们添加了“stream()”方法来懒惰地处理Optional对象,如下所示:

    
    Stream<Optional> emp = getEmployee(id)
    Stream empStream = emp.flatMap(Optional::stream)
    

    这里使用Optional.stream()方法将Employee对象的Stream转换为Employee流,以便我们可以在结果代码中懒惰地处理这个结果。

    要通过更多示例了解有关此功能的更多信息并阅读添加到Optional类的更多新方法,请查看我的原始教程:Java SE 9:可选类改进

  11. 流API改进

    在Java SE 9中,Oracle公司为java.util.Stream接口添加了四个有用的新方法。由于Stream是一个接口,所有这些新实现的方法都是默认方法。其中两个非常重要:dropWhile和takeWhile方法

    如果您熟悉Scala语言或任何函数编程语言,您肯定会了解这些方法。这些是编写一些功能样式代码的非常有用的方法。我们在这里讨论一下takeWhile实用方法。

    此takeWhile()接受谓词作为参数,并返回给定Stream值的子集Stream,直到Predicate第一次返回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改进

  12. 增强的@Deprecated注释

    在Java SE 8及更早版本中,@ Deprecated annotation只是一个没有任何方法的Marker接口。它用于标记Java API,它是类,字段,方法,接口,构造函数,枚举等。

    在Java SE 9中,Oracle Corp增强了@Deprecated注释,以提供有关弃用API的更多信息,并提供工具来分析应用程序对已弃用API的静态使用情况。他们有添加两种方法将这些过时的接口:forRemoval服务于这个信息。

    阅读我的原始教程:Java SE 9:增强的@Deprecated注释,以查看一些有用的示例。

  13. HTTP 2客户端

    在Java SE 9中,Oracle Corp将发布新的HTTP 2 Client API以支持HTTP / 2协议和WebSocket功能。由于现有或旧版HTTP客户端API存在许多问题(例如支持HTTP / 1.1协议且不支持HTTP / 2协议和WebSocket,仅适用于阻止模式和许多性能问题。),他们正在用新HTTP替换此HttpURLConnection API客户。

    他们将在“java.net.http”包下引入新的HTTP 2 Client API。它支持HTTP / 1.1和HTTP / 2协议。它支持同步(阻塞模式)和异步模式。它支持使用WebSocket API的异步模式。

    我们可以在以下网址看到这个新的API:http://download.java.net/java/jdk9/docs/api/java/net/http/package-summary.html

    HTTP 2客户端示例

    
    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. 多分辨率图像API

    在Java SE 9中,Oracle公司将推出一种新的多分辨率图像API。此API中的重要接口是MultiResolutionImage。它在java.awt.image包中提供。

    MultiResolutionImage封装了一组具有不同高度和宽度(即不同分辨率)的图像,并允许我们根据我们的要求查询它们。

  15. 其他Java 9功能

    在本节中,我将列出一些杂项Java SE 9新功能。我不是说这些不太重要的功能。通过一些有用的例子,它们对于理解它们也很重要和有用。

    截至目前,我没有获得有关这些功能的足够信息。这就是为什么我要将它们列在这里以便进行简要理解。我将逐一获取这些功能,并通过简短的讨论和示例添加到上面的部分。最后再写一个单独的教程。

    • GC(垃圾收集器)改进
    • Stack-Walking API
    • 过滤传入的序列化数据
    • 弃用Applet API
    • Indify String Concatenation
    • 增强的方法句柄
    • Java平台日志记录API和服务
    • 紧凑的弦乐
    • Nashorn的Parser API
    • Javadoc搜索
    • HTML5 Javadoc

我将逐个拾取这些java 9功能,并用足够的描述和示例更新它们。

这些都是关于java 9功能的简要说明。

 

翻译&转载:https://www.journaldev.com/13121/java-9-features-with-examples

你可能感兴趣的:(Java,Unix&Unix-Like,Java)