ada*_*ubi 127 java arrays java-8 java-stream
目前,每当我需要从数组创建流时,我都会这样做
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Run Code Online (Sandbox Code Playgroud)
是否有一些从数组创建流的直接方法?
sol*_*4me 192
你可以使用Arrays.stream例如
Arrays.stream(array);
Run Code Online (Sandbox Code Playgroud)
您也可以Stream.of像@fge一样使用,看起来像
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Run Code Online (Sandbox Code Playgroud)
但是注意Stream.of(intArray)将返回Stream<int[]>,但是如果你传递一个类型的数组,Arrays.stream(intArr)它将返回.因此简而言之,对于基元类型,您可以观察两种方法之间的差异IntStreamint[]
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Run Code Online (Sandbox Code Playgroud)
将原始数组传递给时Arrays.stream,将调用以下代码
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
Run Code Online (Sandbox Code Playgroud)
当您传递原始数组时,Stream.of将调用以下代码
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Run Code Online (Sandbox Code Playgroud)
因此,你得到不同的结果.
更新:如Stuart Marks所述,注释子范围超载Arrays.stream比使用更好,Stream.of(array).skip(n).limit(m)因为前者导致SIZED流,而后者则不然.原因是limit(m)不知道大小是m还是小于m,而是进行Arrays.stream范围检查并知道流的确切大小您可以读取Arrays.stream(array,start,end) 此处返回的流实现的源代码,而对于返回的流实现Stream.of(array).skip().limit()则是在这种方法中.
fge*_*fge 43
替代@ sol4me的解决方案:
Stream.of(theArray)
Run Code Online (Sandbox Code Playgroud)
这和Arrays.stream()它之间的区别在于:如果你的数组是原始类型,那确实会有所不同.例如,如果你这样做:
Arrays.stream(someArray)
Run Code Online (Sandbox Code Playgroud)
这里someArray是一个long[],它会返回一个LongStream.Stream.of()另一方面,将Stream<long[]>使用单个元素返回a .
Dim*_*ima 13
Stream.of("foo", "bar", "baz")
Run Code Online (Sandbox Code Playgroud)
或者,如果您已经有阵列,也可以这样做
Stream.of(array)
Run Code Online (Sandbox Code Playgroud)
对于原始类型使用IntStream.of或LongStream.of等
| 归档时间: |
|
| 查看次数: |
60263 次 |
| 最近记录: |