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

Java: Преобразование потока в массив

В этом уроке мы преобразуем поток Java в массив Java. Это можно сделать для примитивных типов и объектов, используя метод Stream.toArray ().

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

Вступление

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

Поток.toArray()

Метод toArray() является встроенным методом из класса 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() принимает ссылку на конструктор массива для соответствующего объекта и возвращает массив этого типа. Давайте создадим Поток из Строковых объектов и преобразуем его в массив:

// Create a List of Strings
List list = new ArrayList<>();
list.add("John");
list.add("Jenny");
list.add("Martha");

// Stream the List
Stream 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() требует использования конструктора массива, и мы использовали ссылку на метод для указания типа – Строка[]::новый . toArray() возвращает массив указанного типа, и если тип не указан, произойдет несоответствие:

String[] array = stream.toArray();

В результате возникает ошибка компилятора:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

error: incompatible types: Object[] cannot be converted to String[]

Вместо сокращенных ссылок на методы мы также можем использовать лямбда-выражения для достижения этой цели. Давайте отфильтруем только имена, которые начинаются с “J”:

// Create a List of Strings
List list = new ArrayList<>();
list.add("John");
list.add("Jenny");
list.add("Martha");

// Stream the List
Stream 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.toArray () , хотя и с несколько иным использованием.