如何从数组创建流?

目前,每当我需要从数组创建流时,我都会这样做

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

是否有一些直接的方法从数组创建流?

68749 次浏览

你可以使用 Arrays.stream。

Arrays.stream(array);

还可以使用@fge 提到的 Stream.of,它看起来像

public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}

但是注意,如果传递一个类型为 int[]的数组,Stream.of(intArray)将返回 Stream<int[]>,而 Arrays.stream(intArr)将返回 IntStream。因此,简而言之,对于基元类型,您可以观察到两种方法之间的区别,例如。

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 Marks评论所提到的 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)

其中 someArraylong[],它将返回 LongStream。另一方面,Stream.of()将返回包含单个元素的 Stream<long[]>

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

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

Stream.of(array)

对于基本类型,使用 IntStream.ofLongStream.of等。

你也可以使用低级方法,它有并行选项:

更新: 使用 full array. length (不是 length-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)

你可以使用 Arrays.stream:

Stream (数组) ;

这确保返回类型的蒸汽基于您的阵列输入类型,如果它的 String []然后返回 Stream<String>,如果 int []然后返回 IntStream

当你已经知道输入类型的数组,然后好使用具体的一样为输入类型 int[]

 IntStream.of(array); 

This returns Intstream.

In first example, Java uses method overloading to find specific method based on input types while as in second you already know the input type and calling specific method.

但这是最直接的方法

Stream.Builder<String> builder = Stream.builder();
for( int i = 0; i < array.length; i++ )
builder.add( array[i] );
Stream<String> stream = builder.build();