殺すためのインタビュー|Java8-18によって導入された新機能について話してください(6)

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して13日目です。クリックしてイベントの詳細をご覧ください

Java8は2014年3月18日にリリースされ、2022年4月6日の時点で、最新のリリースはJava18です。バージョン17、11、および8は、現在サポートされているロングタームサポート(LTS)リリースです。この記事では、Java8以降の各バージョンの機能を確認します。ベンチに座って行ってください。前の記事を読みたい場合は、ここをクリックしてインタビューとアンチキルをご覧ください| Java8-18によって導入された新機能についてお話しください(5)

Java16の新機能

Stream.toList()

Java 16から、Collectors.toList()を使用する代わりに、ストリームから結果をリストに直接収集できます。

List<Integer> collectedList = locList.stream().filter( l -> l >=2).collect(Collectors.toList());
复制代码

上記のコードは、以下と同じ結果を生成します。

List<Integer> collectedListNew = locList.stream().filter( l -> l >=2).toList();
复制代码

プロキシインスタンスからデフォルトのメソッドを呼び出す

インターフェイスのデフォルトメソッドの拡張として、Java 16のリリースでは、Java.lang.reflectがサポートされています。InvocationHandlerは、リフレクションを使用した動的プロキシを使用して、インターフェイスのデフォルトのメソッドを呼び出します。

簡単なデフォルトのメソッドの例を見てみましょう。

interface HelloWorld {
    default String hello() {
        return "world";
    }
}
复制代码

この改善により、リフレクションを使用して、このインターフェイスのプロキシのデフォルトメソッドを呼び出すことができます。

Object proxy = Proxy.newProxyInstance(getSystemClassLoader(), new Class<?>[] { HelloWorld.class },
    (prox, method, args) -> {
        if (method.isDefault()) {
            return InvocationHandler.invokeDefault(prox, method, args);
        }
        // ...
    }
);
Method method = proxy.getClass().getMethod("hello");
assertThat(method.invoke(proxy)).isEqualTo("world");
复制代码

日中サポート

am /pm形式の代替を提供する日時フォーマッタ「b」への新しい追加:

LocalTime date = LocalTime.parse("15:25:08.690791");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h B");
assertThat(date.format(formatter)).isEqualTo("3 in the afternoon");
复制代码

「午後3時」の代わりに「午後3時」を取得します。短いスタイル、完全なスタイル、および狭いスタイルには、それぞれ「b」、「BBBB」、または「bbb」のDateTimeFormatterパターンを使用することもできます。

もちろん、以下を含むがこれらに限定されない他の新機能があります。

  • ベクターAPIインキュベーター
  • レコードへの新しい追加

Java17の新機能

Java 17はロングタームサポート(LTS)リリースであり、2021年9月14日に一般提供になり、14のJEPエントリがあります。

image.png

JEP 306: Restore Always-Strict Floating-Point Semantics

这个 JEP 主要用于数值敏感的程序,主要用于科学目的; 它再次使默认的浮点操作变得严格,或者叫做 Strictfp,以确保每个平台上的浮点计算得到相同的结果。

自 Java 1.2以来,我们需要关键字 strictfp 来启用严格的浮点计算。默认的浮点计算从严格改为略微不同的浮点计算(避免过热问题)。

Java17将前 java1.2严格的浮点计算恢复为默认值,这意味着关键字 strictfp 现在是可选的。

JEP 356: Enhanced Pseudo-Random Number Generators

这个 JEP 引入了一个叫做 RandomGenerator 的新接口,使得未来的 PRNG 算法更容易实现和使用。这个接口的伪随机数生成器是:

package java.util.random;
​
public interface RandomGenerator {
  //...
}
复制代码

下面的示例使用新的 java17随机发生器工厂获得著名的 Xoshiro256PlusPlus PRNG 算法来生成特定范围内的随机整数,0-10。

package com.mine.java17.jep356;
​
import java.util.random.RandomGenerator;
import java.util.random.RandomGeneratorFactory;
​
public class JEP356 {
​
  public static void main(String[] args) {
​
      RandomGenerator randomGenerator = RandomGeneratorFactory.of("Xoshiro256PlusPlus").create(999);
​
      System.out.println(randomGenerator.getClass());
​
      int counter = 0;
      while(counter<=10){
          // 0-10
          int result = randomGenerator.nextInt(11);
          System.out.println(result);
          counter++;
      }
​
  }
}
复制代码

下面的代码生成所有的 Java 17 PRNG 算法。

  RandomGeneratorFactory.all()
              .map(fac -> fac.group()+ " : " +fac.name())
              .sorted()
              .forEach(System.out::println);
复制代码

17还重构了遗留的随机类,比如 Java.util.Random、 SplittableRandom 和 securierandom,以扩展新的随机生成器接口。

JEP 382: New macOS Rendering Pipeline

苹果在 macOS 10.14发布版(2018年9月)中不推荐 OpenGL 渲染库,而是支持新的 Metal 框架,以获得更好的性能。

这个 JEP 改变了 macOS 的 java2d (如 Swing GUI)内部呈现管道,从 Apple OpenGL API 改为 Apple Metal API; 这是一个内部改变; 没有新的 java2d API,也没有改变任何现有的 API。

JEP 409: Sealed Classes

Java15およびJava16では、プレビュー機能として封印されたクラスが導入されました。現在のJEPは、クラスの囲みが標準機能になったことを宣言しています。封印されたクラスとインターフェースは、サブタイプになることができる人を制御または制限します。

もちろん、以下を含むがこれらに限定されない他の新機能があります。

  • JEP 391:macOS/AArch64ポート
  • JEP 398:削除のためのアプレットAPIの非推奨
  • JEP 403:JDK内部を強力にカプセル化
  • JEP 406:スイッチのパターンマッチング(プレビュー)
  • JEP 407:RMIアクティベーションを削除
  • JEP 410:実験的なAOTおよびJITコンパイラを削除します
  • JEP 411:削除のためにSecurityManagerを非推奨
  • JEP 412:Foreign Function&Memory API(インキュベーター)

引き続き、各バージョンの新機能についてお話ししますので、お楽しみに!
最終章、Java18は2022年3月22日にリリースされました。

おすすめ

転載: juejin.im/post/7085868668017442823