it-swarm.com.ru

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

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

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

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

121
adam.kubi

Вы можете использовать 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);
 }

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

Обновлено: Как упомянуто Стюарт Маркс comment Перегрузка поддиапазона 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(), находится внутри этот метод .

183
sol4me

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

Stream.of(theArray)

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

Arrays.stream(someArray)

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

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

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

Stream.of(array) 

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

13
Dima

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

String [] затем возвращает Stream<String>, если int [] затем возвращает IntStream 

Если вы уже знаете массив типов ввода, то лучше использовать конкретный, например, для типа ввода int[]

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

0
vipul patel

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

Обновление: используйте всю длину array.length (не 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)
0
merqlove