Menu
Coddy logo textTech

パターンマッチング

CoddyのJavaジャーニー「ロジックとフロー」セクションの一部 — レッスン 37/59。

Javaのパターンマッチングにより、オブジェクトが特定の型であるかをテストし、そこからコンポーネントを抽出できます。これにより、型チェックとキャスト操作が簡素化されます。

instanceof を使用したパターンマッチングの使い方を見てみましょう:

Object obj = "Hello";
if (obj instanceof String str) {
   // str is automatically cast to String
   System.out.println(str.toUpperCase());
}

上記のコードを実行した後、出力は次のようになります:

"HELLO"

switch 式でもパターンマッチングを使用できます:

Object value = 42;
String result;
if (value instanceof Integer i) {
    result = "Number: " + i;
} else if (value instanceof String s) {
    result = "Text: " + s;
} else {
    result = "Unknown";
}

上記のコードを実行した後、resultには次の内容が含まれます:

“Number: 42”

challenge icon

チャレンジ

簡単

processValue という名前のメソッドを作成してください。このメソッドは 1 つの引数を受け取ります:

  1. 異なる型になり得る Object (value)

このメソッドは、instanceof を用いたパターンマッチングを使用して value を処理し、次のルールに基づいて文字列を返します:

  • Integer の場合:"Number: " に続けて値を 2 倍にしたものを返します
  • String の場合:"Text: " に続けて値を大文字にしたものを返します
  • Boolean の場合:"Boolean: " に続けて値を反転させたもの(true が false になり、false が true になります)を返します
  • その他の型の場合:"Unknown" を返します

チートシート

Javaのパターンマッチングを使用すると、オブジェクトが特定の型であるかをテストし、そこからコンポーネントを抽出できます。これにはinstanceofを使用します:

Object obj = "Hello";
if (obj instanceof String str) {
   // str is automatically cast to String
   System.out.println(str.toUpperCase());
}

複数のパターンマッチングチェックを連鎖させることができます:

Object value = 42;
String result;
if (value instanceof Integer i) {
    result = "Number: " + i;
} else if (value instanceof String s) {
    result = "Text: " + s;
} else {
    result = "Unknown";
}

自分で試してみよう

import java.util.Scanner;

public class Main {
    public static String processValue(Object value) {
        // TODO: instanceof を用いたパターンマッチングで値を処理する
        // Integerの場合: "Number: " + (value * 2) を返す
        // Stringの場合: "Text: " + value.toUpperCase() を返す
        // Booleanの場合: "Boolean: " + (!value) を返す
        // その他の型の場合: "Unknown" を返す
        
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String type = scanner.nextLine();
        String inputValue = scanner.nextLine();
        
        Object value = switch(type) {
            case "Integer" -> Integer.parseInt(inputValue);
            case "String" -> inputValue;
            case "Boolean" -> Boolean.parseBoolean(inputValue);
            default -> inputValue;
        };
        
        System.out.println(processValue(value));
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン