Рубрики
Без рубрики

Новые функции в Java 12

Изучите новые функции, реализованные в Java 12.

Автор оригинала: baeldung.

1. введение

В этом уроке мы проведем краткий обзор некоторых новых функций, которые появились в Java 12. Полный список всех новых функций доступен в официальной документации .

2. Языковые изменения и особенности

Java 12 вводит множество новых языковых функций. В этом разделе мы обсудим несколько наиболее интересных из них с примерами кода для лучшего понимания.

2.1. Новые методы Класса String

Java 12 поставляется с двумя новыми методами в классе String .

Первый – indent регулирует отступ каждой строки на основе целочисленного параметра. Если параметр больше нуля, то в начале каждой строки будут вставлены новые пробелы. С другой стороны, если параметр меньше нуля, он удаляет пробелы из начала каждой строки. Если данная строка не содержит достаточного количества пробелов, то все ведущие символы пробела удаляются.

Теперь давайте рассмотрим простой пример. Во-первых, мы сделаем отступ текста четырьмя пробелами, а затем удалим весь отступ:

String text = "Hello Baeldung!\nThis is Java 12 article.";

text = text.indent(4);
System.out.println(text);

text = text.indent(-10);
System.out.println(text);

Вывод выглядит следующим образом:

    Hello Baeldung!
    This is Java 12 article.

Hello Baeldung!
This is Java 12 article.

Обратите внимание, что даже если мы передали значение -10, которое превышает наше количество отступов, были затронуты только пробелы. Другие символы остаются нетронутыми.

Второй новый метод-это transform . Он принимает функцию с одним аргументом в качестве параметра, который будет применен к строке.

В качестве примера давайте используем метод transform для возврата строки:

@Test
public void givenString_thenRevertValue() {
    String text = "Baeldung";
    String transformed = text.transform(value ->
      new StringBuilder(value).reverse().toString()
    );

    assertEquals("gnudleaB", transformed);
}

2.2. Файл::метод несоответствия

Java 12 представила новый метод mismatch в файле nio.Файлы служебного класса :

public static long mismatch(Path path, Path path2) throws IOException

Этот метод используется для сравнения двух файлов и нахождения положения первого несовпадающего байта в их содержимом.

Возвращаемое значение будет находиться в инклюзивном диапазоне от 0L до размера байта меньшего файла или-1L, если файлы идентичны.

Теперь давайте рассмотрим два примера. В первом мы создадим два одинаковых файла и попытаемся найти несоответствие. Возвращаемое значение должно быть-1Л:

@Test
public void givenIdenticalFiles_thenShouldNotFindMismatch() {
    Path filePath1 = Files.createTempFile("file1", ".txt");
    Path filePath2 = Files.createTempFile("file2", ".txt");
    Files.writeString(filePath1, "Java 12 Article");
    Files.writeString(filePath2, "Java 12 Article");

    long mismatch = Files.mismatch(filePath1, filePath2);
    assertEquals(-1, mismatch);
}

Во втором примере мы создадим два файла с содержимым “Java 12 Article” и “Java 12 Tutorial”. Метод mismatch должен возвращать 8, так как это первый другой байт:

@Test
public void givenDifferentFiles_thenShouldFindMismatch() {
    Path filePath3 = Files.createTempFile("file3", ".txt");
    Path filePath4 = Files.createTempFile("file4", ".txt");
    Files.writeString(filePath3, "Java 12 Article");
    Files.writeString(filePath4, "Java 12 Tutorial");

    long mismatch = Files.mismatch(filePath3, filePath4);
    assertEquals(8, mismatch);
}

2.3. Сборщик тиков

Новый teeing collector был введен в Java 12 как дополнение к классу Collectors :

Collector teeing(Collector downstream1,
  Collector downstream2, BiFunction merger)

Он представляет собой композит из двух нижележащих коллекторов. Каждый элемент обрабатывается обоими нижестоящими коллекторами. Затем их результаты передаются в функцию слияния и преобразуются в конечный результат.

Пример использования teeing collector – это подсчет среднего значения из набора чисел. Первый параметр коллектора будет суммировать значения, а второй даст нам количество всех чисел. Функция слияния возьмет эти результаты и подсчитает среднее значение:

@Test
public void givenSetOfNumbers_thenCalculateAverage() {
    double mean = Stream.of(1, 2, 3, 4, 5)
      .collect(Collectors.teeing(Collectors.summingDouble(i -> i), 
        Collectors.counting(), (sum, count) -> sum / count));
    assertEquals(3.0, mean);
}

2.4. Компактное Форматирование чисел

Java 12 поставляется с новым number formatter – CompactNumberFormat . Он предназначен для представления числа в более короткой форме, основанной на шаблонах, предоставляемых данной локализацией.

Мы можем получить его экземпляр с помощью метода get Compact Number Instance в классе NumberFormat :

public static NumberFormat getCompactNumberInstance(Locale locale, NumberFormat.Style formatStyle)

Как уже упоминалось ранее, параметр locale отвечает за предоставление правильных шаблонов формата. Стиль формата может быть как КОРОТКИМ, так и ДЛИННЫМ. Чтобы лучше понять стили формата, давайте рассмотрим номер 1000 в локали США. КОРОТКИЙ стиль будет форматировать его как “10 тысяч”, а ДЛИННЫЙ-как “10 тысяч”.

Теперь давайте посмотрим на пример, который возьмет количество лайков под этой статьей и компактирует ее с двумя различными стилями:

@Test
public void givenNumber_thenCompactValues() {
    NumberFormat likesShort = 
      NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.SHORT);
    likesShort.setMaximumFractionDigits(2);
    assertEquals("2.59K", likesShort.format(2592));

    NumberFormat likesLong = 
      NumberFormat.getCompactNumberInstance(new Locale("en", "US"), NumberFormat.Style.LONG);
    likesLong.setMaximumFractionDigits(2);
    assertEquals("2.59 thousand", likesShort.format(2592));
}

3. Предварительный просмотр изменений

Некоторые из новых функций доступны только в качестве предварительного просмотра. Чтобы включить их, нам нужно переключить соответствующие настройки в IDE или явно указать компилятору использовать функции предварительного просмотра:

javac -Xlint:preview --enable-preview -source 12 src/main/java/File.java

3.1. Переключение выражений (Предварительный просмотр)

Самая популярная функция, представленная в Java 12, – это выражения Switch .

В качестве демонстрации давайте сравним старые и новые операторы switch. Мы будем использовать их, чтобы отличить рабочие дни от выходных дней на основе перечисления DayOfWeek от экземпляра Local Data .

Во – первых, давайте посмотрим и на старый синтаксис:

DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();
String typeOfDay = "";
switch (dayOfWeek) {
    case MONDAY:
    case TUESDAY:
    case WEDNESDAY:
    case THURSDAY:
    case FRIDAY:
        typeOfDay = "Working Day";
        break;
    case SATURDAY:
    case SUNDAY:
        typeOfDay = "Day Off";
}

А теперь давайте посмотрим на тот же логический переключатель switch expressions:

typeOfDay = switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Working Day";
    case SATURDAY, SUNDAY -> "Day Off";
};

Новые операторы switch не только более компактны и удобочитаемы. Они также устраняют необходимость в операторах break. Выполнение кода не будет проваливаться после первого совпадения.

Еще одно заметное отличие заключается в том, что мы можем назначить оператор switch непосредственно переменной. Раньше это было невозможно.

Кроме того, можно выполнять код в выражениях switch без возврата какого-либо значения:

switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> System.out.println("Working Day");
    case SATURDAY, SUNDAY -> System.out.println("Day Off");
}

Более сложная логика должна быть заключена в фигурные скобки:

case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> {
    // more logic
    System.out.println("Working Day")
}

Обратите внимание, что мы можем выбирать между старым и новым синтаксисом. Java 12 switch expressions-это только расширение, а не замена.

3.2. Сопоставление шаблонов для instanceof (Предварительный просмотр)

Еще одна функция предварительного просмотра, введенная в Java 12, – это сопоставление шаблонов, например.

В предыдущих версиях Java, например, при использовании операторов if вместе с instanceof , нам пришлось бы явно типизировать объект для доступа к его функциям:

Object obj = "Hello World!";
if (obj instanceof String) {
    String s = (String) obj;
    int length = s.length();
}

С помощью Java 12 мы можем объявить новую типизированную переменную непосредственно в операторе:

if (obj instanceof String s) {
    int length = s.length();
}

Компилятор автоматически введет для нас типизированную переменную String s .

4. Изменения в JVM

Java 12 поставляется с несколькими улучшениями JVM. В этом разделе мы кратко рассмотрим несколько наиболее важных из них.

4.1. Шенандоа: Сборщик Мусора С Низкой Паузой

Shenandoah-это экспериментальный алгоритм сборки мусора (GC), на данный момент не включенный в стандартные сборки Java 12.

Он сокращает время паузы GC, выполняя эвакуационную работу одновременно с запущенными потоками Java. Это означает, что в случае Шенандоа время паузы не зависит от размера кучи и должно быть согласованным. Сбор мусора в куче 200 ГБ или в куче 2 ГБ должен иметь аналогичное поведение с низкой паузой.

Shenandoah станет частью магистральных сборок JDK начиная с версии 15.

4.2. Набор Microbenchmark Suite

Java 12 вводит набор из примерно 100 тестов microbenchmark в исходный код JDK.

Эти тесты позволят проводить непрерывное тестирование производительности на JVM и станут полезными для каждого разработчика, желающего работать над самой JVM или создать новый microbenchmark.

4.3. Архивы компакт-дисков по умолчанию

Функция совместного использования данных классов (CDS) помогает сократить время запуска и объем памяти между несколькими виртуальными машинами Java. Он использует встроенный сгенерированный список классов по умолчанию, содержащий выбранные классы основной библиотеки.

Изменение, которое произошло с Java 12, заключается в том, что архив компакт-дисков включен по умолчанию. Чтобы запускать программы с выключенными компакт – дисками, нам нужно установить общий флаг в положение off:

java -Xshare:off HelloWorld.java

Обратите внимание, что это может задержать время запуска программы.

5. Заключение

В этой статье мы увидели большинство новых функций, реализованных в Java 12. Мы также перечислили некоторые другие примечательные дополнения и удаления. Как обычно, исходный код доступен на GitHub .