Java从7版到16版的发展历程

前言

我一直使用Java11,所以我已经习惯了使用Lambda表达式和StreamAPI。但最近我被调到使用Java7的项目上,所以我稍微查了一下有哪些功能可用,哪些功能不可用。

Java的发展历程

我个人认为以下是一些重要的规格变更。只挑选了与应用实现有关的部分。
如果对这个版本有任何必须包括的意见,请在评论中提出。

image.png

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资料链接。请随意下载。