转载

Java版本功能差异一览指南 - 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 = <b>new</b> Runnable(){
       @Override
       <b>public</b> <b>void</b> run(){
         System.out.println(<font>"Hello world !"</font><font>);
       }
     };
</font>

对于lambda,相同的代码如下所示:

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

您还获得了方法参考,重复注释,接口的默认方法以及其他一些语言功能。

2.集合和流

在Java 8中,您还获得了集合的函数式操作,也称为Stream API。一个简单的例子:

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

现在,在Java 8之前的版本中,您基本上必须编写for循环才能对该列表进行处理。

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

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

-Java 9-

Java 9也是一个相当大的发行版,其中增加了一些功能:

1.Collections

集合有几个新的帮助器方法,可以轻松地构造列表,集合和map。

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

2.stream

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

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

3. Optionals

Optionals有了ifPresentOrElse方法。

user.ifPresentOrElse(<b>this</b>::displayAccount, <b>this</b>::displayLogin);

4.Interfaces

接口提供私有方法:

<b>public</b> <b>interface</b> MyInterface {

    <b>private</b> <b>static</b> <b>void</b> myPrivateMethod(){
        System.out.println(<font>"Yay, I am private!"</font><font>);
    }
}
</font>

其他语言特性:还有其他一些改进,例如改进的try-with-resources语句或菱形运算符扩展。

5. jshell

Java提供了一个Shell,您可以在其中试用简单的命令并立即获得结果。

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

jshell> <b>int</b> 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:

<font><i>// Pre-Java 10</i></font><font>

String myName = </font><font>"Marco"</font><font>;

</font><font><i>// With Java 10</i></font><font>

<b>var</b> myName = </font><font>"Marco"</font><font>
</font>

-Java 11-

从开发人员的角度来看,Java 11的发行版也较小。

1.字符串和文件

字符串和文件有一些新方法(此处未列出所有方法):

<font>"Marco"</font><font>.isBlank();
</font><font>"Mar/nco"</font><font>.lines();
</font><font>"Marco  "</font><font>.strip();

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

2.运行源文件

从Java 10开始,您可以直接运行Java源文件,而无需先对其进行编译。迈向脚本编写的一步。

 java MyScript.java

3. Lambda参数的局部变量类型推断(var)

(<b>var</b> firstName, <b>var</b> 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语句如下所示:

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

2.多行字符串

可以在Java中执行此操作:

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

String htmlWithJava13 = </font><font>""</font><font></font><font>"
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
</font>
原文  https://www.jdon.com/53413
正文到此结束
Loading...