Java版本功能差異一覽指南 - marcobehler

banq發表於2019-11-23

您可以使用本指南獲取有關如何查詢和安裝最新Java的實用資訊、Java語言功能的概述,包括Java版本8-13。

瞭解Java發行版之間的差異(AdoptOpenJdk,OpenJDK,OracleJDK等):Java版本安裝完整指南 

基本上,所有 Java 8語言功能(現在不要挑剔)也可以在Java 13中使用。兩者之間的所有其他Java版本也是如此。

反過來,這意味著Java 8的所有語言功能都可以作為非常好的Java基礎知識,而其他所有功能(Java 9-13)則是在該基線之上的許多附加功能。

以下是特定版本所提供內容的快速概述:

-Java 8-

Java 8是一個巨大的版本,您可以在Oracle網站上找到所有功能的列表。不過,我想在此提及兩個主要功能:

1. 語言功能:Lambdas等

在Java 8之前,無論何時要例項化(例如)新的Runnable,都必須編寫一個匿名內部類,如下所示:

Runnable runnable = new Runnable(){
       @Override
       public void run(){
         System.out.println("Hello world !");
       }
     };

對於lambda,相同的程式碼如下所示:

Runnable runnable = () -> System.out.println("Hello world two!");

您還獲得了方法參考,重複註釋,介面的預設方法以及其他一些語言功能。

2.集合和流

在Java 8中,您還獲得了集合的函式式操作,也稱為Stream API。一個簡單的例子:

List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

現在,在Java 8之前的版本中,您基本上必須編寫for迴圈才能對該列表進行處理。

使用Streams API,您可以執行以下操作:

list.stream()
    .filter(name -> name.startsWith("f"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

-Java 9-

Java 9也是一個相當大的發行版,其中增加了一些功能:

1.Collections

集合有幾個新的幫助器方法,可以輕鬆地構造列表,集合和map。

List<String> list = List.of("one", "two", "three");
Set<String> set = Set.of("one", "two", "three");
Map<String, String> map = Map.of("foo", "one", "bar", "two");

2.stream

Streams以takeWhile,dropWhile,iterate方法的形式新增了一些附加功能。

Stream<String> stream = Stream.iterate("", s -> s + "s")
  .takeWhile(s -> s.length() < 10);

3. Optionals

Optionals有了ifPresentOrElse方法。

user.ifPresentOrElse(this::displayAccount, this::displayLogin);

4.Interfaces

介面提供私有方法:

public interface MyInterface {

    private static void myPrivateMethod(){
        System.out.println("Yay, I am private!");
    }
}

其他語言特性:還有其他一些改進,例如改進的try-with-resources語句或菱形運算子擴充套件。

5. jshell

Java提供了一個Shell,您可以在其中試用簡單的命令並立即獲得結果。

% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> int x = 10
x ==> 10

6.HTTP客戶端

Java 9帶來了新HttpClient的初始預覽版。直到那時,Java的內建Http支援還只是底層的,您不得不依靠第三方庫,例如Apache HttpClient或OkHttp(它們是很棒的庫,btw!)。

使用Java 9,Java有了自己的現代客戶端-儘管處於預覽模式,這意味著在更高版本的Java中可能會有所更改。

7.模組專案:Java模組和多版本jar檔案

Java 9獲得了Jigsaw Module System,它在某種程度上類似於舊的OSGI規範。深入瞭解Jigsaw不在本指南的範圍內,但是請檢視以前的連結以瞭解更多資訊。

多版本.jar檔案使一個.jar檔案成為可能,其中包含針對不同JVM版本的不同類。因此,例如,在Java 8與Java 10上執行時,您的程式可以表現不同/具有不同的類。

-Java 10-

Java 10進行了一些更改,例如Garbage Collection等。但是,作為開發人員,您唯一可能真正看到的更改就是引入了“ var”關鍵字,也稱為區域性變數型別推斷。

區域性變數型別推斷:var-keyword:

// Pre-Java 10

String myName = "Marco";

// With Java 10

var myName = "Marco"

-Java 11-

從開發人員的角度來看,Java 11的發行版也較小。

1.字串和檔案

字串和檔案有一些新方法(此處未列出所有方法):

"Marco".isBlank();
"Mar\nco".lines();
"Marco  ".strip();

Path path = Files.writeString(Files.createTempFile("helloworld", ".txt"), "Hi, my name is!");
String s = Files.readString(path);

2.執行原始檔

從Java 10開始,您可以直接執行Java原始檔,而無需先對其進行編譯。邁向指令碼編寫的一步。

 java MyScript.java

3. Lambda引數的區域性變數型別推斷(var)

(var firstName, var lastName) -> firstName + lastName

4.HttpClient

來自Java 9的HttpClient的最終非預覽版本。

5.飛行記錄器,無操作垃圾收集器,已棄用Nashorn-Javascript-Engine等

-Java 12-

Java 12有一些新功能和清理功能,但是這裡唯一值得一提的是Unicode 11支援和新開關表示式的預覽,您將在下一節中看到。

-Java 13-

您可以在此處找到完整的功能列表,但實際上,您將獲得Unicode 12.1支援,以及兩個新的或改進的預覽功能(將來可能會更改):

1.switch表示式

現在可以返回一個值。而且,您可以對錶達式使用lambda樣式的語法,而不會出現直通/突破問題:

舊的switch語句如下所示:

switch(status) {

  case SUBSCRIBER:

    // code block

    break;

  case FREE_TRIAL:

    // code block

    break;

  default:

    // code block

}

在Java 13中,switch語句如下所示:

boolean result = switch (status) {
    case SUBSCRIBER -> true;
    case FREE_TRIAL -> false;
    default -> throw new IllegalArgumentException("something is murky!");
};

2.多行字串

可以在Java中執行此操作:

String htmlBeforeJava13 = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>

String htmlWithJava13 = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>

 

相關文章