目前,每当我需要从数组创建流时,我都会
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
是否有一些从数组创建流的直接方法?
答案 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)
其中someArray
是long[]
,它将返回LongStream
。另一方面,Stream.of()
将返回带有单个元素的Stream<long[]>
。
答案 2 :(得分:13)
Stream.of("foo", "bar", "baz")
或者,如果您已经有阵列,也可以
Stream.of(array)
对于原始类型,请使用IntStream.of
或LongStream.of
等
答案 3 :(得分:0)
你也可以通过具有并行选项的低级方法来实现它:
/**
* 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();