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


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

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

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

4 117

4 ответа:

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

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[]. Таким образом, в двух словах для примитивов типа вы можете наблюдать разницу между 2 методами, например.

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) потому что первый приводит к размерному потоку, а второй-нет. Причина в том, что limit(m) не знает, является ли размер m или меньше m, тогда как Arrays.stream проверяет диапазон и знает точный размер потока Вы можете прочитать исходный код для реализации потока, возвращенный Arrays.stream(array,start,end)здесь, тогда как для реализации потока возвращается Stream.of(array).skip().limit() внутри этот метод.

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

Stream.of(theArray)

о разнице между этим и Arrays.stream(): это тут изменить ситуацию, если Ваш массив примитивного типа. Например, если вы делаете:

Arrays.stream(someArray)

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

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

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

Stream.of(array) 

для примитивных типов использовать IntStream.of или LongStream.of etc.

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

обновление: используйте полный набор.длина (не длина - 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)