Java 12 – Новые функции и улучшения

Java 12 (выпущена 19 марта 2019 года) — это последняя версия, доступная для JDK. Давайте посмотрим, какие новые функции и улучшения он принесет разработчикам и архитекторам.

Collectors.teeing() в Stream API

Коллектор teeing был представлен как статический метод Collectors::teeing. Этот сборщик пересылает свои входные данные двум другим сборщикам перед объединением их результатов с функцией.

teeing(Collector, Collector, BiFunction) принимает два сборщика и функцию для объединения их результатов. Каждый элемент, переданный результирующему сборщику, обрабатывается обоими нижестоящими сборщиками, затем их результаты объединяются с помощью указанной функции слияния в конечный результат.

Например, в заданном списке сотрудников, если мы хотим найти сотрудника с максимальной зарплатой и минимальной зарплатой, мы можем сделать это в одном объявлении, используя teeing collector.

SalaryRange salaryRange = Stream
            .of(56700, 67600, 45200, 120000, 77600, 85000)
            .collect(teeing(
                    minBy(Integer::compareTo), 
                    maxBy(Integer::compareTo), 
                    SalaryRange::fromOptional));

Изменения String API

String.indent()

Метод отступа помогает изменить отступ строки. Мы можем передать либо положительное, либо отрицательное значение в зависимости от того, хотим ли мы добавить больше пробелов или удалить существующие пробелы.

String result = "foo\nbar\nbar2".indent(4);
 
System.out.println(result);
 
//    foo
//    bar
//    bar2

Пожалуйста, обратите внимание, что метод indent() автоматически добавляет символ новой строки, если он еще не был предоставлен. Этого следовало ожидать, и это особенность нового метода.

Каждый символ пробела обрабатывается как отдельный символ. В частности, символ табуляции «\t» (U+0009) считается одним символом; он не расширяется.

String.transform()

Метод transform() принимает строку и преобразует ее в новую строку с помощью функции.

В данном примере у нас есть список имен. Мы выполняем две операции (обрезка пробелов и приведение всех имен в верблюжий регистр) с помощью метода transform().

List<String> names = List.of(
                  "   Alex",
                  "brian");
 
List<String> transformedNames = new ArrayList<>();
 
for (String name : names) 
{
    String transformedName = name.transform(String::strip)
                      .transform(StringUtils::toCamelCase);
 
    transformedNames.add(transformedName);
}

Строковые константы

Начиная с Java 12, класс String реализует два дополнительных интерфейса java.lang.constant.Constable и java.lang.constant.ConstantDesc.

Класс String также вводит два дополнительных низкоуровневых метода, describeConstable() и resolveConstantDesc(MethodHandles.Lookup).

Это низкоуровневые API, предназначенные для библиотек и инструментов, обеспечивающих синтаксический анализ и генерацию байт-кода, например, Byte Buddy.

Просто отметим, что тип Constable — это тип, значения которого являются константами, которые могут быть представлены в пуле констант файла класса Java, как описано в JVMS 4.4, и экземпляры которого могут описывать себя номинально как ConstantDesc.

resolveConstantDesc() аналогичен Descripteconstable() с той разницей, что этот метод вместо этого возвращает экземпляр ConstantDesc.

Files.mismatch(Path, Path)

Иногда мы хотим определить, имеют ли два файла одинаковое содержимое. Этот API помогает сравнивать содержимое файлов.

Метод mismatch() сравнивает два пути к файлам и возвращает длинное значение. Значение long указывает позицию первого несовпадающего байта в содержимом двух файлов. Возвращаемое значение будет равно “-1”, если файлы «равны».

Path helloworld1 = tempDir.resolve("helloworld1.txt");
 
Path helloworld2 = tempDir.resolve("helloworld2.txt");
 
long diff = Files.mismatch(helloworld1, helloworld2); //returns long value

Форматирование компактных чисел

Большие числа, отображаемые пользовательским интерфейсом или инструментом командной строки, всегда трудно разобрать. Гораздо чаще используется сокращенная форма числа. Компактные представления чисел намного легче читаются и требуют меньше места на экране без потери первоначального смысла.

Например, 3.6 M гораздо легче читать, чем 3 600 000.

Java 12 вводит удобный метод NumberFormat.getCompactNumberInstance(Locale, NumberFormat.Style) для создания компактного представления чисел.

Support for Unicode 11

В то время, когда смайлики играют решающую роль в общении по каналам социальных сетей, как никогда важно поддерживать последнюю спецификацию Unicode. Java 12 идет в ногу со временем и поддерживает Unicode 11.

Unicode 11 добавляет 684 символа, в общей сложности 137 374 символа, и семь новых сценариев, в общей сложности 146 сценариев.

Новый Switch Expressions(для ознакомления)

Это изменение расширяет оператор switch, так что его можно использовать либо как оператор, либо как выражение.

Вместо того, чтобы определять оператор break для каждого блока case, мы можем просто использовать стрелочный синтаксис . Стрелочный синтаксис семантически выглядит как лямбда-выражение и отделяет метку регистра от выражения.

С помощью новых выражений switch мы можем напрямую назначить оператор switch переменной.

boolean isWeekend = switch (day) 
{
  case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false;
 
  case SATURDAY, SUNDAY -> true;
 
  default -> throw new IllegalStateException("Illegal day entry :: " + day);
};
 
System.out.println(isWeekend);  //true or false - based on current day

Чтобы использовать эту функцию предварительного просмотра, помните, что мы должны явно указать JVM во время запуска приложения, используя флаг –enable-preview.

Запись опубликована автором в рубрике Java с метками .

Добавить комментарий

Ваш адрес email не будет опубликован.

три × 1 =