Java从7版到16版的发展历程
前言
我一直使用Java11,所以我已经习惯了使用Lambda表达式和StreamAPI。但最近我被调到使用Java7的项目上,所以我稍微查了一下有哪些功能可用,哪些功能不可用。
Java的发展历程
我个人认为以下是一些重要的规格变更。只挑选了与应用实现有关的部分。
如果对这个版本有任何必须包括的意见,请在评论中提出。
Java8 (only need one option)
Java八
2014年03月18日正式发布(GA)
https://openjdk.java.net/projects/jdk8/
匿名函数
https://openjdk.java.net/projects/lambda/ 可以让您了解有关Java的Lambda表达式的信息。
https://qiita.com/sano1202/items/64593e8e981e8d6439d3 可以帮助您更深入地理解有关Java Lambda表达式的内容。
public static void main(String[] args) {
Runnable runner = () -> { System.out.println("Hello Lambda!"); };
runner.run(); //Hello Lambda!
}
可以方便地调用匿名函数。
通常与StreamAPI一起广泛使用。
流API
对于基于集合创建的Java Stream API,可以执行中间处理和终端处理。
通过方法链,可以将各种处理以简洁的方式写出来。
以下是中文的自由翻译(仅提供一种选择):
可选的
允许空值并具有空值检查机制的类。
日期和时间 API
在Java中有很多方便处理日期和时间的类,比如DateTimeFormatter和ZonedDateTime。
Java9->Java 9
2017年9月21日正式发布(GA)
https://openjdk.java.net/projects/jdk9/
Java8已经过去了三年半时间了,从那以后似乎每半年就有一个版本更新。
可以实现模块化
尝试使用Java 9的模块功能 – Qiita
添加JShell
https://openjdk.java.net/jeps/222 的簡體中文翻譯如下:
由於不常在應用程式中使用,所以沒有在頂部放置,但Java的交互式執行環境JShell是在這個地方新增的。
$>jshell
| JShellへようこそ -- バージョン15.0.2
| 概要については、次を入力してください: /help intro
jshell> System.out.println("Hello, JShell.");
Hello, JShell.
Java十
2018/03/20 正式发布(GA)
https://openjdk.java.net/projects/jdk/10/
透過var進行類型推斷。
当右侧明确表明类型时,可以使用var关键字来定义类型。
当更改方法返回的类型时,而无需更改接收它的变量类型,这会非常方便。
var list = new ArrayList<String>(); // infers ArrayList<String>
var stream = list.stream(); // infers Stream<String>
Java11是一个编程语言和计算机平台,旨在提高开发人员的生产力和程序的性能。它是Java编程语言的最新版本,具有许多新特性和功能,包括增强的性能、更好的安全性和可扩展性。 Java11的发布对于开发Java应用程序的开发者来说是一个重要的里程碑,可以利用新的功能和改进来构建更高效、更安全的应用程序。
2018年9月25日正式发布
https://openjdk.java.net/projects/jdk/11/
推理型的λ表達式對應
(var x, var y) -> x.process(y)
// is equivalent to:
(x, y) -> x.process(y)
HTTP客户端
一个支持HTTP2的HTTP客户端。有了这个就不再需要费力地使用HttpURLConnection了。
// Sync
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Java14: 我需要一个选项来以汉语原生方式进行复述
2020/03/17 正式发布(GA)
https://openjdk.java.net/projects/jdk/14/
切换式
https://openjdk.java.net/jeps/361网页介绍了如何将Switch语句作为表达式处理,并且可以接收返回值。
似乎不再需要在Switch语句之前创建实例,从而可以使代码更简洁。
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
Java15: Java十五
2020年9月15日正式发布(GA)
https://openjdk.java.net/projects/jdk/15/
文字区块
【现代的Java】JEP 378:文本块正式发布于Java15中。
原文:用引号括起来可以表示多行字符串的字面量。可以处理包含”字符而不需要转义,也可以很好地处理缩进。
以下的例子中,以最浅的嵌套作为基准,保持缩进。
HTML example
Using "one-dimensional" string literals
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
Using a "two-dimensional" block of text
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
Java16可以进行原生的中文译为「Java十六」。
2021年3月16日计划正式发布(GA)
https://openjdk.java.net/projects/jdk/16/
记录
Java14预览版记录(Hishidama的记录Java14预览版备忘录)
// as-is
public final class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int x() {
return this.x;
}
public int y() {
return this.y;
}
@Override
public int hashCode() {
~
}
@Override
public boolean equals(Object other) {
~
}
@Override
public String toString() {
return "Point[x=" + this.x + ", y=" + this.y + "]";
}
}
// to-be
public record Point(int x, int y) { } // 簡潔に定義できる
“instanceOf模式匹配”
https://openjdk.java.net/jeps/394 的原文大意是:当使用instanceOf进行类型检查时,可以同时使用该类型的变量。
// as-is
if (obj instanceof String) {
String s = (String)obj;
...
}
// to-be
if (obj instanceof String s) {
// sがStringとして扱える
...
}
(2号预览)封闭类
在Java16目前仍不是正式版本,但计划还将添加sealed类。’,
如果进展顺利,Java17应该会是正式发布版本。
通过限制可以继承的子类的功能,
可以在类或接口的开头加上”sealed”,在”permits”之后指定允许继承和实现的类。
sealed interface Shape
permits Circle, Rectangle { ... }
在上述的例子中,除了Circle和Rectangle之外,无法实现Shape接口。
关于类设计的用途和思考方式,请参考以下文章:
https://www.infoq.com/jp/articles/java-sealed-classes/
尾声
当我们进行此种排列时,可以看出Java8的巨大变化。我认为Java11中增加了与HTTP相关的类和类型推断功能,这些都相当重要。
赠品
由于在研讨会上已经讨论了几乎相同的内容,所以我也附上了该PDF资料链接。请随意下载。