java-common-code/docs/java_construction.md
2025-10-11 18:09:02 +09:00

5.4 KiB
Raw Blame History

Java SE構文8〜21の主要差分まとめ

この文書は、Java SE 8から21までに追加・変更された主要な言語仕様とAPIをまとめたものです。
バージョン間の差分を理解することで、最新のJavaコードを正しく書き分けることができます。


Java 82014年

モダン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 92017年

モジュール化と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 102018年

ローカル変数型推論

  • var キーワード
    var list = new ArrayList<String>();
    
    コンパイル時に型を推論。ただしローカル変数限定。

Java 112018年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〜152019〜2020年

構文改善と新機能の試験導入

  • switch式Java 14で正式導入

    int num = switch (day) {
        case MON, TUE -> 1;
        default -> 0;
    };
    
  • テキストブロックJava 15

    String json = """
        {
          "id": 1,
          "name": "test"
        }
        """;
    

Java 162021年

record と sealed の前段階

  • recordクラスデータ専用クラス

    public record Point(int x, int y) {}
    Point p = new Point(1, 2);
    
  • Stream.toList() Java 8までは collect(Collectors.toList()) が必要だった。


Java 172021年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〜202022〜2023年

テスト的・プレビュー的な改良

  • Simple Web Server

    jwebserver -p 8080
    

    簡易HTTPサーバを起動できる。

  • Recordパターンプレビュー

    if (p instanceof Point(int x, int y)) { ... }
    

Java 212023年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

この流れを理解しておくと、古いコードと新しいコードの混在環境でもスムーズに対応できる。