Вступление
В этом руководстве мы будем преобразовывать поток Java в массив Java для примитивных типов, а также объектов.
Stream.toArray ()
Метод toArray()
- это встроенный метод из Stream
который
действительно удобно использовать при преобразовании из Stream
в
массив. Он работает как с примитивными типами, так и с объектами, хотя
есть небольшая разница в использовании.
Метод возвращает новый массив, что означает, что мы будем упаковывать результаты в новый массив для хранения. Для объектов нам нужно указать тип объекта и также предоставить конструктор массива этого типа методу.
Примитивные типы
Java 8 имеет специальные потоки для примитивных типов, т.е. IntStream
, LongStream
и DoubleStream
. Давайте воспользуемся IntStream
для
хранения диапазона целых чисел, а затем преобразуем его в массив:
IntStream stream = IntStream.range(10, 20);
int[] array = stream.toArray();
System.out.println("Printing array ...");
for (int i = 0; i < array.length; ++i)
System.out.print(array[i] + " ");
Это приводит к:
Printing array ...
10 11 12 13 14 15 16 17 18 19
Потоки удобны для манипулирования данными, поэтому вы можете выполнить предварительную обработку в потоке, а не в массиве, и в конце преобразовать его в один:
IntStream stream = IntStream.range(10, 20);
// Filter out all even numbers
int[] array = stream.filter(x -> x%2 == 0).toArray();
System.out.println("\nPrinting even numbers ...");
for (int i = 0; i < array.length; ++i)
System.out.print(array[i] + " ");
Это приводит к:
Printing even numbers ...
10 12 14 16 18
Объекты
Для объектов метод toArray()
принимает ссылку на конструктор массива
для соответствующего объекта и возвращает массив этого типа. Давайте
создадим Stream
из String
и преобразуем его в массив:
// Create a List of Strings
List<String> list = new ArrayList<>();
list.add("John");
list.add("Jenny");
list.add("Martha");
// Stream the List
Stream<String> stream = list.stream();
// Create an array using the toArray() method
String[] array = stream.toArray(String[]::new);
System.out.println("Printing String array ...");
for (int i = 0; i < array.length; ++i)
System.out.println(array[i]);
Это приводит к:
Printing String array...
John
Jenny
Martha
Примечание. Метод toArray()
требует использования конструктора
массива, и мы использовали ссылку на метод, чтобы указать тип -
String[]::new
. toArray()
возвращает массив указанного типа, и если
тип не указан, произойдет несоответствие:
String[] array = stream.toArray();
Результат - ошибка компилятора:
error: incompatible types: Object[] cannot be converted to String[]
Вместо сокращенных ссылок на методы мы также можем использовать лямбда-выражения для достижения этой цели. Отфильтруем только имена, начинающиеся с буквы J:
// Create a List of Strings
List<String> list = new ArrayList<>();
list.add("John");
list.add("Jenny");
list.add("Martha");
// Stream the List
Stream<String> stream = list.stream();
// Filter the stream element and convert to array
String[] array = stream
.filter(string -> string.startsWith("J"))
.toArray(size -> new String[size]);
System.out.println("Printing names starting with 'J'...");
for (int i = 0; i < array.length; ++i)
System.out.println(array[i]);
Это производит:
Printing names starting with 'J'...
John
Jenny
Заключение
В этой статье мы преобразовали Stream
в массив. Это можно сделать для
массивов примитивов и объектов с помощью Stream.toArray()
, хотя и с
немного другим использованием.