我怎样才能创build一个数组stream?
目前,无论何时我需要从数组创buildstream,我都这样做
String[] array = {"x1", "x2"}; Arrays.asList(array).stream();
有一些直接的方法来创build数组的stream?
你可以使用Arrays.stream Eg
Arrays.stream(array);
你也可以像使用Stream.of
所提到的那样使用Stream.of
public static<T> Stream<T> of(T... values) { return Arrays.stream(values); }
但注意Stream.of(intArray)
将返回Stream<int[]>
而Arrays.stream(intArr)
将返回IntStream
只要您传递一个int[]
types的数组即可。 所以简单地说,对于原始types,您可以观察两种方法之间的区别
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); }
因此你会得到不同的结果。
更新 :正如Stuart提到的注释Arrays.stream
的子范围重载优于使用Stream.of(array).skip(n).limit(m)
因为前者导致SIZEDstream,而后者不导致。 原因是limit(m)
不知道大小是m还是小于m,而Arrays.stream
做范围检查并知道stream的确切大小。您可以阅读由Arrays.stream(array,start,end)
返回的stream实现的源代码Arrays.stream(array,start,end)
,而Stream.of(array).skip().limit()
返回的stream实现Stream.of(array).skip().limit()
在这个方法中 。
替代@ sol4me的解决scheme:
Stream.of(theArray)
这个和Arrays.stream()
之间的区别:如果你的数组是一个基本types,它会有所作为。 例如,如果你这样做:
Arrays.stream(someArray)
someArray
是一个long[]
,它将返回一个LongStream
。 Stream.of()
,另一方面,将返回一个Stream<long[]>
与一个单一的元素。
Stream.of("foo", "bar", "baz")
或者,如果你已经有一个数组,你也可以做
Stream.of(array)
对于原始types使用IntStream.of
或LongStream.of
等
你也可以通过具有并行选项的低级方法来实现:
更新:使用完整的数组长度(不是长度 – 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)