java 8からjava 15までの新機能の紹介


本ブログはJava 7以来増加した素晴らしい新機能の例を提供します。各Javaバージョンの少なくとも一つの重要な改善を展示します。2020年秋に発表されたJava 15まであります。Javaは現在、Lambadaと関数式プログラミングを完全にサポートしています。タイプ推定はvarを通して、単純なコンストラクタを持つ不可変のセットと複数の行の文字列です。また、データ類やsealed類など、エキサイティングな実験新機能もあります。最後に、Java REPLについて議論します。それは高速実験のために高い価値を提供します。
関数プログラミング(Java 8)
Java 8では、機能プログラミングおよびlambadaが言語機能に追加されている。関数式プログラミングの二つのコアモデルは不変値であり、関数を一等公民に上げる方法である。データは一連の修正ステップを経て、各ステップはいくつかの入力を必要とし、新しい出力にマッピングする。関数プログラムはJavaのStreamsnull安全mondads(Optional)と一緒に使用できます。次のように…
ストリーム(Java 8)
一般的なコンピュータプログラムでは、通常値リストを使用し、各値に対して所定の変換を実行しなければならない。Java 8の前にforループを使ってこの変換をしなければなりませんが、これからはStreams以下の方法が使えます。

Stream.of("hello", "great")
    .map(s -> s + " world")
    .forEach(System.out::println);
> hello world
> great world
このmap関数は入力として一つのlambanであり、ストリーム中のすべての要素に適用されます。
Streamsは、Lists、SetsおよびMaps(変換により)で動作することができる。Streamsのおかげで、コードの中のほとんどの循環を脱することができます。
Optional(Java 8)
Javaのもう一つのよくある問題はNull Pointer Exceptionsです。したがって、JavaはOptional Cを導入しました。これはmontadです。nullまたはnullではない可能性がある引用を包装しました。このOptionalには、関数的に更新が適用されます。

Optional.of(new Random().nextInt(10))
    .filter(i -> i % 2 == 0)
    .map(i -> "number is even: " + i)
    .ifPresent(System.out::println);
> number is even: 6
上のコードセグメントで乱数を作成し、Optionalオブジェクトに包装して偶数だけ印刷します。
Jシェル(Java 9)
最後に、JavaのREPLがあります。その名前はJShellです。簡単に言えば、JShellはJavaクラスの完全な作成とコンパイルなしにJavaコードセグメントを試みることができます。逆に、コマンドを実行してすぐに結果が表示されます。これは簡単な例です。

$ <JDK>/bin/jshell
jshell> System.out.println("hello world")
hello world
長い間、JavaScriptやPythonなどの解釈型言語に詳しい人たちはREPLに満足していますが、今までJavaにはこの機能が欠けています。JShellは変数を定義することができますが、より複雑なエンティティ、例えば、マルチライン関数、クラス、およびループを実行することもできます。また、JShellは自動的に完成することをサポートしています。Javaクラスに与えられた正確な方法を知らないなら、この機能は非常に有用です。
バリアフリー集合の工場方法(Java 9)
ListsJavaの簡単な初期化はとっくに無くなりましたが、今はもう過ぎました。以前には次のような操作が必要でした。

jshell> List<Integer> list = Arrays.asList(1, 2, 3, 4)
list ==> [1, 2, 3, 4]
これを以下に簡略化します。

jshell> List<Integer> list = List.of(1, 2, 3, 4)
b ==> [1, 2, 3, 4]
List,Set,Mapof(…)というユニークな方法が存在する。これらはすべて1行の簡単なコードだけで不変のオブジェクトを作成します。
var(Java 10)を使用してタイプ推定を行う。
Java 10は、変数の種類を省略することができる新しいvarキーワードを導入する。

jshell> var x = new HashSet<String>()
x ==> []

jshell> x.add("apple")
$1 ==> true
上のコードセグメントでは、コンパイラxは、HashSetと推定することができる。
この機能は、サンプルコードを減少させ、読み取り可能性を向上させるのに役立ちます。ただし、いくつかの制限があります。方法本体の内部でのみ使用できます。コンパイラはコンパイル時にタイプを推測します。したがって、すべての内容はまだ静的なタイプです。
単一ソースファイル起動(Java 11)
以前、ファイルを含む簡単なJavaプログラムを作成した場合、まずコンパイルファイルを使って、javacを使ってそれを実行してください。Java 11では、一つのコマンドで二つのステップを完了できます。

Main.java:
public class Main {
  public static void main(String[] args) {
    System.out.println("hello world");
  }
}
$ java ./Main.java
hello world
Javaクラスだけで構成される簡単な起動プログラムや実験については、単一のソースファイルの機能を起動することで、あなたの生活がより楽になります。
Switch表現(Java 12)
Java 12は私たちにSwitch表現をもたらしてくれました。これはこの表式と古いswitch文の違いを素早く示しています。
古いスイッチ文でプログラムの流れを定義しました。

jshell> var i = 3
jshell> String s;
jshell> switch(i) {
   ...>     case 1: s = "one"; break;
   ...>     case 2: s = "two"; break;
   ...>     case 3: s = "three"; break;
   ...>     default: s = "unknown number";
   ...> }
jshell> s
s ==> "three"
逆に、新しいswitch表現は値を返します。

jshell> var i = 3;
jshell> var x = switch(i) {
   ...>     case 1 -> "one";
   ...>     case 2 -> "two";
   ...>     case 3 -> "three";
   ...>     default -> "unknown number";
   ...> };
x ==> "three"
要するに、古いswitch文はプログラムフローに用いられ、新しいswitch表現は一つの値に解析されます。
この新しいswitch文はマッピング関数です。入力があり(上記の場合i)、出力があります。これは実際にモデルマッチング機能であり、Javaと哈の4年間のプログラミング原理をより互換性のあるものにするのに役立つ。似たようなswitchの言葉は、すでにカラオケで発売されています。
注意すべきいくつかのこと:
ダブルポイントの代わりに、矢印を使います。
breakは不要です
すべての可能性を考慮すると、デフォルトは省略できます。
Java 12でこの機能を有効にするには、--enaber-preview--source 12を使用してください。
複数行の文字列(Java 13)
JSONやXMLなど、長すぎる複数行の文字列を定義しましたか?これまでは、すべての内容を一行に圧縮して改行を使っていたかもしれませんが、Stringはもっと読みにくいです。Java 13は複数行の文字列を持っています。
ケース:

public class Main
{ 
  public static void main(String [] args)
  {
    var s = """
        {
            "recipe": "watermelon smoothie",
            "duration": "10 mins",
            "items": ["watermelon", "lemon", "parsley"]
        }""";
    System.out.println(s);
  }
}
今、私たちはシングルファイルを通じてメールを起動します。

java --enable-preview --source 13 Main.java

{
    "recipe": "watermelon smoothie",
    "duration": "10 mins",
    "items": ["watermelon", "lemon", "parsley"]
}
結果として、文字列は複数行にまたがり、引用符「」はそのまま維持され、さらにタブストップ\tも保持されます。
データクラス:レコード(Java 14)
本論文のすべての新機能の中で、これは一番興奮している機能かもしれません。最後に、Javaにはデータがあります。これらはrecordキーワードで宣言され、自動Getter、構造関数、equals()方法などがある。つまり、大量のサンプルコードを脱することができます。

jshell> record Employee (String name, int age, String department) {}
|  created record Employee

jshell> var x = new Employee("Anne", 25, "Legal");
x ==> Employee[name=Anne, age=25, department=Legal]

jshell> x.name()
$2 ==> "Anne"
Scalはケースクラスに対して類似の機能を持ち、Ktlinに対してデータクラスと同様の機能を有する。これまでJavaでは多くの開発者がLombokを使っていますが、現在レコーダ14によって啓発されている多くの機能を提供しています。詳細についてはBaeldung記事を参照してください。
instance ofには俳優表がない(Java 14)
Javaの初期バージョンはinstance ofキーワードを含んでいます。

Object obj = new String("hello");
if (obj instanceof String) {
  System.out.println("String length: " + ((String)obj).length());
}
不幸な部分:まず、sタイプがStringかどうかを確認し、再度強制変換して長さを取得します。
今はJava 14を使っています。コンパイラは十分に頭が良くて、instance of checkの後で自動的にタイプを推論できます。

Object obj = new String("hello");
if (obj instanceof String mystr) {
  System.out.println("String length: " + mystr.length());
}
シールの種類(Java 15)
sealedキーを使って、指定されたクラスまたはインターフェースを拡張できるクラスを制限できます。これは一例です。

public sealed interface Fruit permits Apple, Pear {
    String getName();
}

public final class Apple implements Fruit {
    public String getName() { return "Apple"; }
}

public final class Pear implements Fruit {
    public String getName() { return "Pear"; }
}
じゃ、これは私たちに何の助けになりますか?はい、今はどれぐらいのフライスがあるか分かります。実際には、完全にサポートされているパターンマッチングの方向に向けての重要なステップであり、このモードでは、エニュメレーションのように種類を扱うことができます。このsealed機能はswitchの前に説明した新しい表現とよく結合されています。
締め括りをつける
過去6年間で、Javaは大きな発展を遂げました。その後、実際には8つのJavaの新バージョンが発表されました。JVMベースの他の競合他社(ScaraとKotlin)と比較して,これらすべての畏敬すべき新機能はJavaを競争選択にするのに役立つ。
Java 8以降のJava新機能の詳細を探しているなら、AndrewのDEV文章とDavid Csakvariのこの文章を紹介します。
以上はjava 8からjava 15までの新機能の紹介の詳細です。javaの新機能に関する資料は他の関連記事に注目してください。