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