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