Автор оригинала: 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 Listlist = 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 Listlist = 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 () , хотя и с несколько иным использованием.