Рубрики
Без рубрики

Преобразование между потоком и массивом в Java

Узнайте, как преобразовать поток в массив, и наоборот в Java.

Автор оригинала: baeldung.

1. Введение

Обычно необходимо преобразовать различные динамические структуры данных в массивы.

В этом учебнике мы продемонстрируем, как преобразовать поток в массив, и наоборот в Java.

2. Преобразование потока в массив

2.1. Метод Справка

Лучший способ конвертировать поток в массив для использования Поток’ s ToArray () метод:

public String[] usingMethodReference(Stream stringStream) {
    return stringStream.toArray(String[]::new);
}

Теперь мы можем легко проверить, была ли конверсия успешной:

Stream stringStream = Stream.of("baeldung", "convert", "to", "string", "array");
assertArrayEquals(new String[] { "baeldung", "convert", "to", "string", "array" },
    usingMethodReference(stringStream));

2.2. Выражение Ламбды

Другим эквивалентом является пройти выражение лямбды в ТоАРРАй () метод:

public static String[] usingLambda(Stream stringStream) {
    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(Stream stringStream) {
    return stringStream.toArray(new MyArrayFunction());
}

Следовательно, мы можем сделать то же утверждение, что и раньше.

2.4. Примитивные массивы

В предыдущих разделах мы исследовали, как преобразовать Струнный поток к Струнные массив. В самом деле, мы можем выполнить преобразование таким образом для любого Объект и это будет выглядеть очень похоже на Струнные примеры выше.

Это немного отличается для примитивов, однако. Если у нас есть Поток Интегер s, которые мы хотим преобразовать в intе , например, сначала нужно позвонить в mapToInt () метод:

public int[] intStreamToPrimitiveIntArray(Stream integerStream) {
    return integerStream.mapToInt(i -> i).toArray();
}

Там также картаToLong () и картаToDouble () методы в нашем распоряжении. Кроме того, обратите внимание, что мы не прошли никаких аргументов в toArray () На этот раз.

Наконец, давайте сделаем утверждение о равенстве и подтвердим, что у нас есть int массив правильно:

Stream integerStream = 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 Stream stringArrayToStreamUsingArraysStream(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 Stream primitiveIntArrayToStreamUsingStreamOf(int[] intArray) {
    return Stream.of(intArray);
}

Но, в отличие от преобразования Объект s массивов, есть важное различие. При преобразовании массива примитивов Arrays.stream () возвращает IntStream , в то время как Stream.of() возвращает Поток<инте > .

3.3. Arrays.stream vs. Stream.of

Чтобы понять различия, упомянутые в предыдущих разделах, мы посмотрим на реализацию соответствующих методов.

Давайте сначала взглянум на реализацию Java этих двух методов:

public  Stream 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);
}

public  Stream of(T t) {
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}

На этот раз, Stream.of() не зовет Arrays.stream () .

4. Заключение

В этой статье мы увидели, как мы можем преобразовать Поток s к массивам в Java и наоборот. Мы также объяснили, почему мы получаем разные результаты при преобразовании массива Объект s и когда мы используем множество примитивов.

Как всегда, полный исходный код можно найти более на GitHub .