我怎样才能创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[] ,它将返回一个LongStreamStream.of() ,另一方面,将返回一个Stream<long[]>与一个单一的元素。

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

或者,如果你已经有一个数组,你也可以做

 Stream.of(array) 

对于原始types使用IntStream.ofLongStream.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)