Как создать поток из массива?

В настоящее время, когда мне нужно создать поток из массива, я делаю

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

Есть ли какой-то прямой способ создания потока из массива?

Ответ 1

Вы можете использовать Arrays.stream, например.

Arrays.stream(array);

Вы также можете использовать Stream.of, как указано @fge, который выглядит как

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

Но примечание Stream.of(intArray) вернет Stream<int[]>, тогда как Arrays.stream(intArr) вернет IntStream, предоставив вам передать массив типа int[]. Таким образом, в двух словах для типа примитивов вы можете наблюдать разницу между двумя методами, например.

int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);

IntStream stream2 = Arrays.stream(arr); 

Когда вы передаете примитивный массив в Arrays.stream, вызывается следующий код

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

и когда вы передаете примитивный массив в Stream.of, вызывается следующий код

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

Следовательно, вы получаете разные результаты.

Обновлено: как указано в комментариях Стюарта Перегрузка поддиапазона Arrays.stream предпочтительнее использования Stream.of(array).skip(n).limit(m), потому что первая приводит к потоку SIZED, в то время как последний не работает. Причина в том, что limit(m) не знает, является ли размер m или меньше m, тогда как Arrays.stream выполняет проверку диапазона и знает точный размер потока Вы можете прочитать исходный код для реализации потока, возвращенный Arrays.stream(array,start,end) здесь, тогда как для реализации потока, возвращаемой Stream.of(array).skip().limit(), находится внутри этот метод.

Ответ 2

Альтернатива решению @sol4me:

Stream.of(theArray)

Отличие между этим и Arrays.stream(): это имеет значение, если ваш массив имеет примитивный тип. Например, если вы выполните:

Arrays.stream(someArray)

где someArray есть long[], он вернет a LongStream. Stream.of(), с другой стороны, вернет a Stream<long[]> с одним элементом.

Ответ 3

Stream.of("foo", "bar", "baz")

Или, если у вас уже есть массив, вы также можете сделать

Stream.of(array) 

Для примитивных типов используйте IntStream.of или LongStream.of и т.д.

Ответ 4

Вы можете сделать это также методом низкого уровня, который имеет параллельную опцию:

Обновление: используйте полный массив .length(не длина - 1).

/** 
 * Creates a new sequential or parallel {@code Stream} from a
 * {@code Spliterator}.
 *
 * <p>The spliterator is only traversed, split, or queried for estimated
 * size after the terminal operation of the stream pipeline commences.
 *
 * @param <T> the type of stream elements
 * @param spliterator a {@code Spliterator} describing the stream elements
 * @param parallel if {@code true} then the returned stream is a parallel
 *        stream; if {@code false} the returned stream is a sequential
 *        stream.
 * @return a new sequential or parallel {@code Stream}
 *
 * <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
 */

StreamSupport.stream(Arrays.spliterator(array, 0, array.length), true)