Как я могу создать поток из массива?
в настоящее время, когда мне нужно создать поток из массива, я делаю
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
есть какой-то прямой способ создать поток из массива?
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[]
, он вернет aLongStream
.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)