Java: конвертируем массив в поток
Вступление
В этом уроке мы будем конвертировать массив в поток. Это можно сделать либо с помощью Arrays.stream(), либо с помощью Stream.of().
Arrays.stream()
Хороший способ превратить массив в поток – это использовать метод stream() класса Arrays.
Простые типы
Для простых типов можно использовать Arrays.stream() со ссылкой на массив в качестве параметра.
При необходимости вы можете указать диапазон индексов, которые следует использовать в качестве начальной и конечной точки потока/массива. Если они не предоставлены, весь массив будет преобразован:
Arrays.stream(T[] arr)
Arrays.stream(T[] arr,int start_ind_Include,int end_ind_Exclude)
)
Давайте создадим экземпляр массива и преобразуем его в поток:
long[] array = {2, 5, 9, 10, 15, 18, 56};
LongStream stream = Arrays.stream(array);
System.out.println("Long stream:");
stream.forEach(x -> System.out.print(x + " "));
Результат:
Long stream:
2 5 9 10 15 18 56
Аналогично, мы можем создать поток из диапазона индексов (0,4), указав их в качестве параметров. Начальный индекс диапазона включен, а конечный индекс не включен, если указан диапазон:
LongStream stream = Arrays.stream(array,0,4);
System.out.println("\nLong stream from index 0 to 3:");
stream.forEach(x -> System.out.print(x + " "));
Результат:
Long stream from index 0 to 3:
2 5 9 10
Объекты
Для объектов функция Arrays.stream() возвращает поток указанного объекта. Он принимает ссылку на массив и, при необходимости, принимает диапазон индексов. Создадим массив строк и преобразуем его в поток:
String[] array = new String[]{"John", "Jenny", "Martha", "Adam"};
Stream<String> stream = Arrays.stream(array);
System.out.println("Entire array:");
stream.forEach(c -> System.out.println(c));
System.out.println("\nSubarray:")
Stream<String> streamWithRange = Arrays.stream(array,0,2);
Вывод следующий:
Entire array:
John
Jenny
Martha
Adam
Subarray:
John
Jenny
Stream.of()
Простые объекты
Вместо того, чтобы использовать класс массивов, мы можем использовать поток. Метод of(), как следует из названия, создаёт поток с заданной коллекцией.
Имейте в виду, Stream.of() возвращает поток объектов, независимо от типа, который вы используете. Вам придётся сгладить его для простых типов. Преобразование/приведение выполняется автоматически для объектов, так как в этом случае метод Stream.of() вызывает Arrays.stream().
Давайте создадим простой массив int:
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Stream<int[]> stream = Stream.of(array);
System.out.println("\nInt stream: ");
stream.flatMapToInt(Arrays::stream).forEach(x -> System.out.print(x + " "));
Выравниванием с помощью метода Arrays.stream(), который в данном случае просто добавляет избыточность в код. Вместо того, чтобы использовать Stream.of() для простых массивов, мы можем использовать встроенные классы, например, IntStream.
Результат:
Int stream:
1 2 3 4 5 6 7 8 9
Объекты
Теперь создадим поток строкового типа. Затем мы отфильтруем только имена, начинающиеся на букву “J”:
String[] array = new String[]{"John", "Jenny", "Martha", "Adam"};
Stream<String> stream = Stream.of(array);
System.out.println("Printing only names that start with 'J'...");
stream.filter(string -> string.startsWith("J"))
.forEach(string -> System.out.pritnln(string));
Вывод следующий:
Printing only names that start with 'J'...
John
Jenny
Заключение
В этой статье мы рассмотрели два способа создания потока из массива.