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フィードバックを取得できます。ローカル設定は不要です。