Java 8-13版本功能差异一览指南 - marcobehler


您可以使用本指南获取有关如何查找和安装最新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>