Menu
Coddy logo textTech

Сопоставление шаблонов

Часть раздела Логика и управление потоком путешествия по Java на Coddy — урок 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. Объект (value), который может быть разных типов

Метод должен использовать сопоставление шаблонов с instanceof для обработки значения и возврата строки на основе этих правил:

  • Если это Integer: вернуть "Number: " за которым следует удвоенное значение
  • Если это String: вернуть "Text: " за которым следует значение в верхнем регистре
  • Если это Boolean: вернуть "Boolean: " за которым следует противоположное значение (true становится false и наоборот)
  • Для любого другого типа: вернуть "Unknown"

Шпаргалка

Сопоставление шаблонов в Java позволяет проверить, имеет ли объект конкретный тип, и извлечь из него компоненты с помощью instanceof:

Object obj = "Hello";
if (obj instanceof String str) {
   // str автоматически приводится к 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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком