# Java SE構文(8〜21の主要差分まとめ) この文書は、Java SE 8から21までに追加・変更された主要な言語仕様とAPIをまとめたものです。 バージョン間の差分を理解することで、最新のJavaコードを正しく書き分けることができます。 --- ## Java 8(2014年) **モダンJavaの基礎となるアップデート** - **ラムダ式** ```java list.forEach(x -> System.out.println(x)); ``` 匿名クラスを簡潔に書ける。 - **Stream API** ```java list.stream().filter(x -> x > 10).map(x -> x * 2).toList(); ``` コレクションを関数的に操作可能。 - **Optional** ```java Optional.ofNullable(value).orElse("default"); ``` Null安全のためのラッパー型。 - **Date and Time API (java.time)** ```java LocalDate.now(); Instant.now(); ``` 新しい日付時刻API(旧java.util.Dateの置換)。 - **Defaultメソッド(interface)** ```java interface A { default void log() { System.out.println("log"); } } ``` --- ## Java 9(2017年) **モジュール化とAPI整備** - **モジュールシステム(Project Jigsaw)** ```java module com.example.app { requires java.sql; exports com.example.app; } ``` 大規模プロジェクト向け依存管理。 - **try-with-resources改良** ```java try (var br = Files.newBufferedReader(path)) { ... } ``` 既存変数もtryリソースとして扱える。 - **Stream API追加メソッド** `takeWhile`, `dropWhile`, `iterate`(predicate付き) - **`var` はまだ導入されていない(Java 10以降)** --- ## Java 10(2018年) **ローカル変数型推論** - **var キーワード** ```java var list = new ArrayList(); ``` コンパイル時に型を推論。ただしローカル変数限定。 --- ## Java 11(2018年LTS) **安定版LTS・実用性の向上** - **新HTTPクライアント(java.net.http)** ```java HttpClient.newHttpClient() .send(HttpRequest.newBuilder(URI.create("https://example.com")).build(), HttpResponse.BodyHandlers.ofString()); ``` - **文字列ユーティリティ** - `" text ".strip()` - `"a\nb\n".lines()` - `"abc".repeat(3)` - **ファイル読み書きの簡略化** ```java String s = Files.readString(Path.of("a.txt")); ``` - **var in lambda** ```java (var x, var y) -> x + y ``` --- ## Java 12〜15(2019〜2020年) **構文改善と新機能の試験導入** - **switch式(Java 14で正式導入)** ```java int num = switch (day) { case MON, TUE -> 1; default -> 0; }; ``` - **テキストブロック(Java 15)** ```java String json = """ { "id": 1, "name": "test" } """; ``` --- ## Java 16(2021年) **record と sealed の前段階** - **recordクラス(データ専用クラス)** ```java public record Point(int x, int y) {} Point p = new Point(1, 2); ``` - **Stream.toList()** Java 8までは `collect(Collectors.toList())` が必要だった。 --- ## Java 17(2021年LTS) **構造的な制約とパターンマッチング** - **sealedクラス** ```java public sealed class Shape permits Circle, Square {} public final class Circle extends Shape {} ``` - **instanceofパターンマッチング** ```java if (obj instanceof String s) { System.out.println(s.length()); } ``` --- ## Java 18〜20(2022〜2023年) **テスト的・プレビュー的な改良** - **Simple Web Server** ```bash jwebserver -p 8080 ``` 簡易HTTPサーバを起動できる。 - **Recordパターン(プレビュー)** ```java if (p instanceof Point(int x, int y)) { ... } ``` --- ## Java 21(2023年LTS) **軽量スレッド(Virtual Thread)とパターンマッチの完成形** - **Virtual Thread** ```java Thread.startVirtualThread(() -> System.out.println("Hello")); ``` 数百万スレッドを軽量に扱える。 - **Pattern Matching for switch** ```java static String format(Object o) { return switch (o) { case Integer i -> "int " + i; case String s -> "str " + s; default -> "unknown"; }; } ``` - **Record Pattern正式採用** ```java record Point(int x, int y) {} if (obj instanceof Point(int x, int y)) { ... } ``` --- ## まとめ | バージョン | 主な特徴 | | ---------- | ------------------------------------------- | | 8 | Lambda, Stream, Optional, 新Date/Time | | 9 | Module System | | 10 | var(型推論) | | 11 | 新HTTP, String/Files改善 | | 14 | switch式 | | 15 | テキストブロック | | 16 | record | | 17 | sealed, instanceof pattern | | 21 | virtual thread, pattern matching for switch | この流れを理解しておくと、古いコードと新しいコードの混在環境でもスムーズに対応できる。