Типизированный Stream-toArray
Преобразование Stream в типизированные массивы с помощью ссылки на метод.
Сравнение кода
✕ Pre-Streams
List<String> list = getNames();
List<String> filtered = new ArrayList<>();
for (String n : list) {
if (n.length() > 3) {
filtered.add(n);
}
}
String[] arr = filtered.toArray(new String[0]);
✓ Java 8+
String[] arr = getNames().stream()
.filter(n -> n.length() > 3)
.toArray(String[]::new);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Типобезопасный
Без приведения к Object[] — тип массива правильный.
Цепочечный
Работает в конце любого потокового конвейера.
Лаконично
Одно выражение заменяет ручной цикл.
Старый подход
Ручная фильтрация + копирование
Современный подход
toArray(generator)
Начиная с JDK
8
Сложность
Начинающий
Поддержка JDK
Типизированный Stream-toArray
Доступно
Широко доступно начиная с JDK 8 (март 2014)
Как это работает
Метод toArray(IntFunction) создаёт правильно типизированный массив из Stream. Генератор (String[]::new) сообщает Stream, какой тип массива нужно создать.
Связанная документация
Доказательство