如何从数组创建流?

时间:2015-01-11 14:57:55

标签: java arrays java-8 java-stream

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

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

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

6 个答案:

答案 0 :(得分:188)

您可以使用Arrays.stream例如

Arrays.stream(array);

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

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

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

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返回的流实现的源代码,而Stream.of(array).skip().limit()返回的流实现则在this method内。

答案 1 :(得分:41)

替代@ sol4me的解决方案:

Stream.of(theArray)

这与Arrays.stream()之间的区别:如果您的数组是基本类型,那么 会产生影响。例如,如果你这样做:

Arrays.stream(someArray)

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

答案 2 :(得分:13)

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

或者,如果您已经有阵列,也可以

Stream.of(array) 

对于原始类型,请使用IntStream.ofLongStream.of

答案 3 :(得分:0)

你也可以通过具有并行选项的低级方法来实现它:

更新:使用完整的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)

答案 4 :(得分:0)

您可以使用Arrays.stream:

Arrays.stream(array); 

这将根据您的数组输入类型确保Steam的返回类型,如果它的String []然后返回Stream<String>,如果int []然后返回IntStream

如果您已经知道输入类型数组,那么可以使用特定的类型,例如输入类型int[]

 IntStream.of(array); 

这将返回Intstream。

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

答案 5 :(得分:0)

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

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