0Pricing
Java Academy · レッスン

Record パターン

パターン内で Record を分解します。

「Record パターン」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

レコードパターン

レコードパターンはレコードにマッチし、そのレコードを分解して、コンポーネントを1回の操作で変数に束縛します。各アクセサーを手作業で呼び出す必要はもうありません。

分解するレコード

まずは単純なレコードから始めます。そのコンポーネントが、パターンで取り出せる要素です。

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Point p = new Point(3, 4);
        System.out.println(p.x() + ", " + p.y());
    }
}

instanceof による分解

instanceof Point p の後に p.x() と書く代わりに、instanceof Point(int x, int y) と書けば、x と y を直接束縛できます。

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Object obj = new Point(3, 4);
        if (obj instanceof Point(int x, int y)) {
            System.out.println("Sum: " + (x + y));
        }
    }
}

コンポーネントがローカル変数になる

パターン内の名前(x、y)は、レコードのコンポーネント値を保持する新しいローカル変数です。名前は自由に選べるため、レコードのコンポーネント名と一致している必要はありません。

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Object obj = new Point(10, 20);
        if (obj instanceof Point(int a, int b)) {
            System.out.println("a=" + a + " b=" + b);
        }
    }
}

パターンで var を使う

コンポーネントに var と書くと、コンパイラーに型を推論させられます。型が長い場合に便利です。

public class Main {
    record Pair(String key, Integer value) {}

    public static void main(String[] args) {
        Object obj = new Pair("age", 30);
        if (obj instanceof Pair(var key, var value)) {
            System.out.println(key + " = " + value);
        }
    }
}

switch でパターンを使う

レコードパターンは switch でも使えるため、case 分岐をデータの形状のように記述できます。

public class Main {
    record Point(int x, int y) {}

    static String classify(Object obj) {
        return switch (obj) {
            case Point(int x, int y) when x == y -> "on diagonal";
            case Point(int x, int y) -> "at " + x + "," + y;
            default -> "not a point";
        };
    }

    public static void main(String[] args) {
        System.out.println(classify(new Point(5, 5)));
        System.out.println(classify(new Point(1, 2)));
    }
}

型推論によるマッチ

パターン内のコンポーネント型は、レコードで宣言された型と互換性がなければなりません。安全な選択は、正確な型または var を使うことです。

ガードとの組み合わせ

レコードパターンの後に when ガードを追加すると、分解された値が条件を満たす場合にだけマッチさせられます。

public class Main {
    record Temperature(double celsius) {}

    static String alert(Object o) {
        if (o instanceof Temperature(double c) && c > 38.0) {
            return "fever: " + c;
        }
        return "normal";
    }

    public static void main(String[] args) {
        System.out.println(alert(new Temperature(39.5)));
        System.out.println(alert(new Temperature(36.6)));
    }
}

より簡潔なデータアクセス

レコードパターンは、必要なフィールドが数個だけの場合に特に効果を発揮します。アクセサー呼び出しの連鎖をなくし、マッチした場所で必要なデータを明確に示せます。

null とレコードパターン

すべての instanceof パターンと同様に、レコードパターンは null に対して false になります。値が null ではないレコードのインスタンスだと確認されてから、分解が行われます。

実践例

コンポーネントを分解して、その値から直接計算を行います。

public class Main {
    record Rectangle(int width, int height) {}

    static int area(Object o) {
        if (o instanceof Rectangle(int w, int h)) {
            return w * h;
        }
        return 0;
    }

    public static void main(String[] args) {
        System.out.println(area(new Rectangle(4, 5)));
        System.out.println(area("not a rect"));
    }
}

理解度チェック

レコードパターンの理解度を確認しましょう。

まとめ

レコードパターンについて学びました。

  • レコード型であることを確認し、コンポーネントを一度に分解できます。
  • コンポーネント名は自由に選べる新しいローカル変数であり、型は var で推論できます。
  • instanceof と switch の両方で使えます。
  • すべてのパターンと同様に、null に対しては false になります。

よくある質問

「Record パターン」レッスンは無料ですか?

はい。「Record パターン」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「Record パターン」で何を学びますか?

パターン内で Record を分解します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Record パターン」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. instanceof のパターンマッチング
  2. Record パターン
  3. ネストした Record パターン
  4. switch のパターン
← Java Academyに戻る