Обновления Java
Новые фичи Java 18
[Новые фичи Java 18]Java 18 вышла 22 марта 2022. Это очередной релиз, который будет поддерживаться до сентября 2022. В этот релиз попало более 200 задач и 9 JEP.
Основные фичи (JEP)
Паттерн-матчинг для switch (Second Preview) (JEP 420)
Сниппеты кода в документации Java API (JEP 413)
Новый метод String.indent()
[Новый метод String.indent()]Метод
indent(n)классаStringпозволяет сделать отступ в пробелов перед строкой, на которой он вызван.Новый синтаксис оператора switch в Java 12
[Новый синтаксис оператора switch в Java 12]Java 12 привносит новый вариант использования оператора
switch. В случаях, если нам нужно сделать присвоение какой-либо переменной в зависимости от нужного условия вcase, мы можем использовать новый синтаксис.Как мы писали на Java конструкции с оператором switch? Примерно так:
public class SwitchOperatorOld { public static void main(String[] args) { // Так было до Java 12 Weekdays weekday = FRIDAY; String typeOfDay; switch (weekday) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: case FRIDAY: typeOfDay = "будний день"; break; case SATURDAY: case SUNDAY: typeOfDay = "выходной день"; break; default: throw new IllegalStateException("Неизвестный день недели!" + weekday); } System.out.println(weekday.getName() + " это " + typeOfDay); } }
skipNBytes() – пропуск N байтов при чтении из InputStream
[skipNBytes() – пропуск N байтов при чтении из InputStream]Интерфейс
InputStreamпредназначен для чтения байтов из потока. МетодskipNBytes(), появившийся в Java 12, позволяет пропустить n байтов и продолжить чтение дальше.Допустим, вы читаете через InputStream содержимое текстового файла:
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; public class SkipNBytes { public static void main(String[] args) throws IOException { InputStream is = ClassLoader.getSystemClassLoader().getResource("hello.txt").openStream(); ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) != -1) { result.write(buffer, 0, length); } String fileContent = result.toString(StandardCharsets.UTF_8.name()); System.out.println(fileContent); is.close(); } }
Collectors.teeing() – новый коллектор в Java 12
[Collectors.teeing() – новый коллектор в Java 12]Java 12 добавляет новый коллектор в свою библиотеку – teeing collector. Этот коллектор принимает два других коллектора в качестве источников значений стрима, и функцию мержа, в которую он передаёт значения из указанных выше коллекторов.
Визуально схему работы teeing коллектора можно изобразить следующим образом:
Кстати, слово teeing переводится как «тройной», «тройниковый», «T-образный», что отражает суть работы коллектора – принять два значения, произвести некоторые операции над ними и выдать третье, результирующее значение.
Давайте рассмотрим следующий пример по вычислению среднеарифметического значения набора чисел:
double average = Stream.of(1, 4, 2, 7, 4, 6, 5) .collect(teeing( summingDouble(i -> i), counting(), (sum, n) -> sum / n)); System.out.println("Среднее значение ряда: " + average);Примечание: здесь
teeing,summingDoubleиcounting– статически импортированные методы классаCollectors.Что же происходит в данном коде?
С помощьюsummingDoublesколлектора суммируются все значения:summingDouble(i -> i)
а с помощью counting коллектора подсчитывается количество элементов в стриме:
counting()
После того, как два коллектора выдали результат своих вычислений, teeing коллектор использует переданную функцию, чтобы вычислить среднеарифметическое значение:
(sum, n) -> sum / n)
После этого teeing коллектор возвратит результат:
Среднее значение ряда: 4.142857142857143
Таким образом, teeing коллектор полезен в тех случаях, когда вам требуется распараллелить стрим на два коллектора и затем смержить промежуточные значения в какое-то одно.
Полный исходный код примера:
import java.util.stream.Stream; import static java.util.stream.Collectors.*; public class TeeingCollector { public static void main(String[] args) { double average = Stream.of(1, 4, 2, 7, 4, 6, 5) .collect(teeing( summingDouble(i -> i), counting(), (sum, n) -> sum / n)); System.out.println("Среднее значение ряда: " + average); } }