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

Введение В этом руководстве мы будем преобразовывать поток Java в массив Java для примитивных типов, а также объектов. Stream.toArray () Метод toArray () - это встроенный метод из класса Stream, который действительно удобно использовать при преобразовании из Stream в массив. Он работает как с примитивными типами, так и с объектами, хотя есть небольшая разница в использовании. Метод возвращает новый массив, что означает, что мы будем упаковывать результаты в новый массив для хранения. Для об

Вступление

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus