Новости Java #8

• Вышло два новых черновика JEP: Record and Array Patterns (Preview) и Pattern Matching for switch (Preview).

В первом JEP'е предлагается ввести в язык паттерны записей и паттерны массивов. Паттерны записей будут выглядеть следующим образом:

record Point(int x, int y) {}
...
if (o instanceof Point(int x, int y)) {
    System.out.println(x + y);
}

Паттерны могут быть вложенными:

if (r instanceof Rectangle(ColoredPoint(Point p, Color c), ColoredPoint r)) {
    System.out.println(c);
}

Паттерны массивов выглядят так:

if (o instanceof String[] { String s1, String s2, ... }) {
    System.out.println(s1 + s2);
}

Паттерн на примере выше срабатывает для массивов длины 2 или более. Если нужен паттерн строгой длины 2, то многоточие не нужно указывать:

if (o instanceof String[] { String s1, String s2 }) {
    System.out.println(s1 + s2);
}

Есть возможность осуществлять паттерн-матчинг по многомерным массивам. Также можно вкладывать паттерны массивов в паттерны записей и наоборот.

Во втором JEP'е предлагается ввести паттерн-матчинг по типу для оператора switch, и это будет выглядеть следующим образом:

Object o = ...
return switch (o) {
    case Integer i -> String.format("int %d", i);
    case Byte b -> String.format("byte %d", b);
    case Long l -> String.format("long %d", l);
    case Double d -> String.format("double %f", d);
    case String s -> String.format("String %s", s);
    default -> o.toString();
};

Если пользователю нужен матчинг null, то придётся указывать отдельную ветку:

switch (o) {
    case null -> System.out.println("Null");
    case String s -> System.out.println("String: " + s);
}

Если не указывать явную ветку case null и в switch передастся нулевой объект, то будет выбрасываться NullPointerException, даже если будет присутствовать ветка default:

String s = null;
switch (s) { // will throw NPE
    case "Foo", "Bar" -> System.out.println("My favourite!");
    default -> System.out.println("Acceptable...");
}

Чтобы ветка default покрывала null, нужно будет использовать паттерн null, default:

String s = null;
switch (s) {
    case "Foo", "Bar" -> System.out.println("My favourite!");
    case null, default -> System.out.println("Acceptable...");
}

Паттерн null можно будет также объединять и с паттерном по типу:

return switch (o) {
    case Integer i -> String.format("int %d", i);
    case Byte b -> String.format("byte %d", b);
    case Long l -> String.format("long %d", l);
    case Double d -> String.format("double %f", d);
    case null, String s -> String.format("String %s", s);
    default -> o.toString();
};

В первой итерации поддержки смешанных паттернов (паттернов по типу и константных паттернов в одном switch) не будет:

switch (s) {
    case "Hello world" ->
        System.out.println("Hello back");
    case String s -> // Error
        System.out.println("Nothing?");
}

switch также будет поддерживать условные паттерны. Для этого предлагается ввести охранные паттерны вида true(boolean expr) и false(boolean expr):

Shape s = ...
switch (s) {
    case Triangle t & true(t.calculateArea() > 100) ->
        System.out.println("Large Triangle");
    default ->
        System.out.println("A shape (including small triangles");
}

Если оба JEP'а будет реализованы вместе, то первый будет дополнять возможности второго. Так, все паттерны по записям и массивам можно будет использовать и в ветках switch (в том числе вложенные).

• Вышел первый релиз-кандидат языка Scala 3: Scala 3.0.0-RC1. В эту версию попало более 400 пулл-реквестов от контрибьюторов с прошлого релиза 3.0.0-M3.

Scala 3, разработка которой более 5 лет ведётся в проекте Dotty – это полная переработка Scala 2, но в значительной части с ней совместимая: большая часть кода на Scala 2 остаётся валидным кодом для компилятора Scala 3, а для остального кода есть гид по миграции.

Также вышло обновление Scala 2.13.5. В него попала поддержка последних версий Java вплоть до ещё не вышедшей Java 17, поддержка Scala 3.0.0-RC1, более безопасный паттерн-матчинг и другие изменения.

• Опубликованы результаты опроса Jakarta EE, который проводился с сентября 2020 по февраль 2021 года. В нём 684 респондента ответили на вопросы относительно использования технологий Java EE / JakartaEE. Из интересных результатов опроса следующие факты:

  • Самый используемый сервер приложений – это RedHat WildFly, а самый ненавистный – IBM WebSphere.
  • Наиболее часто используемые API: JPA, CDI и JAX-RS.
  • Наиболее часто используемые библиотеки: Hibernate, Weld и Hibernate Validator.
  • MicroProfile попробовало 32% опрошенных. Это на 16% больше, чем 2 года назад.
  • Самые популярные продукты MicroProfile: Quarkus, WildFly и Payara Micro.

• Была объявлена виртуальная конференция JakartaOne Livestream на русском, которая пройдёт 31 марта 2021 года.

• Вышли новые ранние сборки JDK: JDK 17-ea+11, JDK 17-panama+2-51.

• Вышлая версия 1.0 библиотеки FlatLaf для кроссплатформенного Look and Feel в приложениях на Swing.

• В официальной документации Android обнаружили, что аннотация @Deprecated помечена как Deprecated. Эта ошибка возникла из-за того, что в JavaDoc аннотации присутствовал код {@code @deprecated}, который сигнализировал парсеру документации добавить "пропущенную" аннотацию @Deprecated. Баг уже был устранён.

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

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