В Java появится паттерн-матчинг

Паттерн-матчинг (сопоставление с образцом) является довольно популярной синтаксической конструкцией, которая есть практически во всех функциональных языках. За годы их существования эта конструкция уже настолько доказала свою пользу и необходимость, что начала проникать и в известные императивные языки. И теперь очередь дошла и до Java: паттерн-матчинг получил свой JEP и был включён в проект Amber, где ведётся исследование и разработка будущих языковых улучшений. Помимо паттерн-матчинга там также есть локальный вывод типов (var), data-классы, подчёркивания, улучшенные перечисления, перекрытия лямбда-параметров и т.д.

Смысл паттерн-матчинга заключается в объединении проверки типа и извлечения из структуры необходимых компонентов. Сейчас такое делается с помощью оператора instanceof и последующего приведения:

if (value instanceof Integer) {
    int i = (Integer) value;
    System.out.println("int %d", i);
}

Такая конструкция является довольно громоздкой и чреватой ошибками. Паттерн-матчинг решает эту проблему с помощью нового оператора matches:

if (value matches Integer i) {
    System.out.println("int %d", i);
}

Кроме того, паттерн-матчинг можно будет сделать с помощью улучшенного оператора switch:

switch (value) {
    case Integer i: System.out.println("int %d", i); break;
    ...
}

Также в будущем планируется развить идею паттерн-матчинга ещё больше и добавить матчинг с деструктуризацией, а также позволить оператору switch возвращать значение:

double area = switch (shape) {
    case Circle(var center, var radius)
        -> PI * radius * radius;
    case Square(var lowerLeft, var edge)
        -> edge * edge;
    case Rect(var lowerLeft, var upperRight)
        -> (upperRight.x - lowerLeft.x)
           * (upperRight.y - lowerLeft.y);
    ...
};

При всей своей привлекательности введение паттерн-матчинга порождает ряд вопросов, которые на данный момент ожидают ответа:

Некоторые из этих вопросов кажутся действительно сложными, и это вызывает некое опасение, что паттерн-матчинг в Java может быть отложен на неопределённое время или полностью отвергнут, как это произошло с Enhanced Enums. Однако мы будем надеяться, что этого не произойдёт, и разработчики языка смогут решить вышеописанные проблемы.

Подписывайтесь на канал в Telegram, чтобы не пропускать новости.

Все материалы на этом сайте выложены под лицензией CC BY-SA 4.0
© Евгений Козлов, 2017-2020