Как я могу создать поток из массива?
в настоящее время, когда мне нужно создать поток из массива, я делаю
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.ofetc.
вы можете сделать это также метод низкого уровня, который имеет параллельный вариант:
обновление: используйте полный набор.длина (не длина - 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)