В настоящее время, когда мне нужно создать поток из массива, я делаю
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Есть ли какой-то прямой способ создания потока из массива?
В настоящее время, когда мне нужно создать поток из массива, я делаю
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Есть ли какой-то прямой способ создания потока из массива?
Вы можете использовать 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()
, находится внутри этот метод.
Альтернатива решению @sol4me:
Stream.of(theArray)
Отличие между этим и Arrays.stream()
: это имеет значение, если ваш массив имеет примитивный тип. Например, если вы выполните:
Arrays.stream(someArray)
где someArray
есть long[]
, он вернет a LongStream
. Stream.of()
, с другой стороны, вернет a Stream<long[]>
с одним элементом.
Stream.of("foo", "bar", "baz")
Или, если у вас уже есть массив, вы также можете сделать
Stream.of(array)
Для примитивных типов используйте IntStream.of
или LongStream.of
и т.д.
Вы можете сделать это также методом низкого уровня, который имеет параллельную опцию:
/**
* 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)