1. Введение
Обычно необходимо преобразовать различные динамические структуры данных в массивы.
В этом учебнике мы продемонстрируем, как преобразовать поток в массив, и наоборот в Java.
2. Преобразование потока в массив
2.1. Метод Справка
Лучший способ конвертировать поток в массив для использования Поток’ s ToArray () метод:
public String[] usingMethodReference(StreamstringStream) { return stringStream.toArray(String[]::new); }
Теперь мы можем легко проверить, была ли конверсия успешной:
StreamstringStream = Stream.of("baeldung", "convert", "to", "string", "array"); assertArrayEquals(new String[] { "baeldung", "convert", "to", "string", "array" }, usingMethodReference(stringStream));
2.2. Выражение Ламбды
Другим эквивалентом является пройти выражение лямбды в ТоАРРАй () метод:
public static String[] usingLambda(StreamstringStream) { return stringStream.toArray(size -> new String[size]); }
Это даст нам тот же результат, что и при использовании ссылки на метод.
2.3. Пользовательский класс
Или, мы можем пойти на все, и создать полномасштабный класс.
Как мы видим из Поток документация , это занимает IntФункционная в качестве аргумента. Он принимает размер массива в качестве ввода и возвращает массив такого размера.
Конечно, IntФункционная интерфейс, чтобы мы могли реализовать его:
class MyArrayFunction implements IntFunction{ @Override public String[] apply(int size) { return new String[size]; } };
Затем мы можем построить и использовать в обычном режиме:
public String[] usingCustomClass(StreamstringStream) { return stringStream.toArray(new MyArrayFunction()); }
Следовательно, мы можем сделать то же утверждение, что и раньше.
2.4. Примитивные массивы
В предыдущих разделах мы исследовали, как преобразовать Струнный поток к Струнные массив. В самом деле, мы можем выполнить преобразование таким образом для любого Объект и это будет выглядеть очень похоже на Струнные примеры выше.
Это немного отличается для примитивов, однако. Если у нас есть Поток Интегер s, которые мы хотим преобразовать в intе , например, сначала нужно позвонить в mapToInt () метод:
public int[] intStreamToPrimitiveIntArray(StreamintegerStream) { return integerStream.mapToInt(i -> i).toArray(); }
Там также картаToLong () и картаToDouble () методы в нашем распоряжении. Кроме того, обратите внимание, что мы не прошли никаких аргументов в toArray () На этот раз.
Наконец, давайте сделаем утверждение о равенстве и подтвердим, что у нас есть int массив правильно:
StreamintegerStream = IntStream.rangeClosed(1, 7).boxed(); assertArrayEquals(new int[]{1, 2, 3, 4, 5, 6, 7}, intStreamToPrimitiveIntArray(integerStream));
Что делать, если мы должны сделать наоборот, однако? Давайте посмотрим.
3. Преобразование массива в поток
Мы, конечно, можем пойти и в другую сторону. И Java имеет некоторые специализированные методы для этого.
3.1. Массив объектов
Мы можем преобразовать массив в Поток с помощью Arrays.stream () или Stream.of() методы :
public StreamstringArrayToStreamUsingArraysStream(String[] stringArray) { return Arrays.stream(stringArray); } public Stream stringArrayToStreamUsingStreamOf(String[] stringArray) { return Stream.of(stringArray); }
Следует отметить, что в обоих случаях наши поток в то же время, как наш массив.
3.2. Массив примитивов
Аналогичным образом, мы можем преобразовать массив примитивов:
public IntStream primitiveIntArrayToStreamUsingArraysStream(int[] intArray) { return Arrays.stream(intArray); } public StreamprimitiveIntArrayToStreamUsingStreamOf(int[] intArray) { return Stream.of(intArray); }
Но, в отличие от преобразования Объект s массивов, есть важное различие. При преобразовании массива примитивов Arrays.stream () возвращает IntStream , в то время как Stream.of() возвращает Поток<инте > .
3.3. Arrays.stream vs. Stream.of
Чтобы понять различия, упомянутые в предыдущих разделах, мы посмотрим на реализацию соответствующих методов.
Давайте сначала взглянум на реализацию Java этих двух методов:
publicStream stream(T[] array) { return stream(array, 0, array.length); } public Stream of(T... values) { return Arrays.stream(values); }
Мы видим, что Stream.of() на самом деле Arrays.stream () внутренне, и это, очевидно, причина, почему мы получаем те же результаты.
Теперь мы проверим методы в случае, если мы хотим преобразовать массив примитивов:
public IntStream stream(int[] array) { return stream(array, 0, array.length); } publicStream of(T t) { return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false); }
На этот раз, Stream.of() не зовет Arrays.stream () .
4. Заключение
В этой статье мы увидели, как мы можем преобразовать Поток s к массивам в Java и наоборот. Мы также объяснили, почему мы получаем разные результаты при преобразовании массива Объект s и когда мы используем множество примитивов.
Как всегда, полный исходный код можно найти более на GitHub .