如何从数组创建流?

How can I create a stream from an array?

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

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

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

您可以使用Arrays.stream例如

Arrays.stream(array);

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

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

但请注意 Stream.of(intArray) 将 return Stream<int[]>Arrays.stream(intArr) 将 return 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);
 }

因此你会得到不同的结果。

已更新:正如 Stuart Marks 评论所述 Arrays.stream 的子范围重载优于使用 Stream.of(array).skip(n).limit(m),因为前者会产生 SIZED 流,而后者不会。原因是 limit(m) 不知道大小是 m 还是小于 m,而 Arrays.stream 会进行范围检查并知道流的确切大小 您可以阅读由 Arrays.stream(array,start,end) here, whereas for stream implementation returned by Stream.of(array).skip().limit() is within this method.

编写的流实现的源代码 return

替代@sol4me 的解决方案:

Stream.of(theArray)

这与 Arrays.stream() 之间的区别:如果您的数组是基本类型, 会有所不同。例如,如果您这样做:

Arrays.stream(someArray)

其中 someArraylong[],它将 return 是 LongStream。另一方面,Stream.of() 将 return 一个具有单个元素的 Stream<long[]>

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

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

Stream.of(array) 

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

您也可以通过具有并行选项的低级方法制作它:

更新:使用完整 array.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 :

Arrays.stream(array); 

这确保了 return 类型的蒸汽基于您的数组输入类型,如果它 String [] 那么 return Stream<String>,如果 int [] 那么 return秒IntStream

当您已经知道输入类型数组时,最好使用特定的数组,例如输入类型 int[]

 IntStream.of(array); 

这 returns Instream。

在第一个示例中,Java 使用方法 overloading 根据输入类型查找特定方法,而在第二个示例中,您已经知道输入类型并调用特定方法。

很少见,但这是最直接的方式

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