问题
目前,每当我需要从数组创建流时,我都会这样做
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
是否有一些从数组创建流的直接方法?
#1 热门回答(170 赞)
你可以使用Arrays.stream例如。
Arrays.stream(array);
你也可以使用@fge提到的Stream.of
,看起来像
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
但noteStream.of(intArray)
将返回Stream<int[]>
whereasArrays.stream(intArr)
将返回IntStream
,提供传递typeint[]
的数组。因此简而言之,对于基元类型,你可以观察到两种方法之间的区别。
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返回的流实现的源代码,而由4334125633返回的流实现在this method内。
#2 热门回答(40 赞)
替代@ sol4me的解决方案:
Stream.of(theArray)
这和.Arrays.stream()
的区别在于:如果你的数组是基本类型,则会产生差异。例如,如果你这样做:
Arrays.stream(someArray)
wheresomeArray
是along[]
,它将返回aLongStream
.Stream.of()
,另一方面,将返回aStream<long[]>
与单个元素。
#3 热门回答(13 赞)
Stream.of("foo", "bar", "baz")
或者,如果你已经有阵列,也可以
Stream.of(array)
对于原始类型,请使用IntStream.of
或LongStream.of
etc。