Answers:
您可以使用Arrays.stream Eg
Arrays.stream(array);
您也可以使用Stream.of
@fge所提到的,它看起来像
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
但是note Stream.of(intArray)
将返回,Stream<int[]>
而Arrays.stream(intArr)
如果IntStream
您传递type数组,则将返回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()
is 可以读取的流实现的源代码。在这种方法内。
Stream.of
可能会给您带来一些惊喜(例如,当您Arrays.asList
使用原始数组进行调用并且人们期望List<Integer>
返回时:))
Arrays.stream
支持流式传输数组的范围,IntStream.of
但不支持。与此相反,Stream.of
是更好的选择,如果你想要一个Stream<int[]>
尺寸的1
...
Arrays.stream
最好使用的子范围重载,Stream.of(array).skip(n).limit(m)
因为前者会导致SIZED流,而后者则不会。原因是limit(m)
不知道大小是否m
小于m
,而Arrays.stream
范围检查并知道流的确切大小。
@ sol4me解决方案的替代方案:
Stream.of(theArray)
在this和Arrays.stream()
:之间的区别在于,如果您的数组是原始类型,它的确会有所不同。例如,如果您这样做:
Arrays.stream(someArray)
这里someArray
是一个long[]
,它会返回一个LongStream
。Stream.of()
另一方面,将返回Stream<long[]>
带有单个元素的。
Arrays.stream()
可以使用
*Stream.of()
时,你有Arrays.stream()
与原始阵列的时候。至于不是真正对象的数组,那是Java,自1.0开始就是如此。沉思于此无济于事
Arrays.stream()
不方便,我认为这很方便。说够了。
*Stream.of()
更容易谬误;因为这是喜好问题。Arrays.stream()
对于这种情况,我更喜欢,这通常Stream.of()
会更方便,这是错误的做法(Peano代数)。
Stream.of("foo", "bar", "baz")
或者,如果您已经有一个数组,也可以执行
Stream.of(array)
对于基本类型,请使用IntStream.of
或LongStream.of
等。
int[]
可以将an 传递给接受varargs的方法时,为什么不Stream.of(intArray)
产生a Stream<Integer>
而不是Stream<int[]>
?此外,是否有任何技术上的原因,为什么有专门用于基元的Stream类?
int[]
不像其他数组。这不是一个子类Object[]
,但它是一个子类Object
。因此,当您将其传递给时Stream.of
,它将作为Object
,参数,并获得的流int[]
。这就是为什么要为基元设置专门的类的原因之一-如果不从基元数组创建流,将非常痛苦。另一个原因,是一家专业类是更有效,因为不需要招致不Object
从拳击开销(转换int
至Integer
以使它看起来像普通的对象)。
int[]
是an Object
,它将匹配重载方法of(T t)
,因此返回Stream<int[]>
。因此,从理论上讲,如果没有这种方法,我们会得到Stream<Integer>
回报吗?还是因为找不到匹配方法而导致编译错误?即int[]
不能被视为T...
Stream<Integer>
那样,因为Stream.of(t ... T)
仍然会以相同的方式匹配。
您也可以通过具有并行选项的低级方法来实现:
/**
* 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
具有原始数组的所有重载情况。即Stream.of(new int[]{1,2,3})
会给您一个,Stream<int[]>
而Arrays.stream
会给您一个IntStream
可能是您想要的。所以+1