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