如何从数组创建流?
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)
其中 someArray
是 long[]
,它将 return 是 LongStream
。另一方面,Stream.of()
将 return 一个具有单个元素的 Stream<long[]>
。
Stream.of("foo", "bar", "baz")
或者,如果你已经有了一个数组,你也可以
Stream.of(array)
对于基本类型使用IntStream.of
或LongStream.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();
目前,每当我需要从数组创建流时,我都会这样做
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.
替代@sol4me 的解决方案:
Stream.of(theArray)
这与 Arrays.stream()
之间的区别:如果您的数组是基本类型, 会有所不同。例如,如果您这样做:
Arrays.stream(someArray)
其中 someArray
是 long[]
,它将 return 是 LongStream
。另一方面,Stream.of()
将 return 一个具有单个元素的 Stream<long[]>
。
Stream.of("foo", "bar", "baz")
或者,如果你已经有了一个数组,你也可以
Stream.of(array)
对于基本类型使用IntStream.of
或LongStream.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();