如何从数组创建流?

2022-08-31 08:00:12

目前,每当我需要从数组创建流时,我都会这样做

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

有没有一些直接的方法可以从数组创建流?


答案 1

您可以使用Arrays.stream例如

Arrays.stream(array);

您也可以使用 @fge 中提到的 ,看起来像Stream.of

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

但是 note 将返回,而将返回,前提是您传递类型为 .因此,简而言之,对于基元类型,您可以观察到2种方法之间的差异,例如:Stream.of(intArray)Stream<int[]>Arrays.stream(intArr)IntStreamint[]

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 注释 中提到的,子范围重载比使用更可取,因为前者会产生 SIZE 流,而后者则不会。原因是不知道大小是 m 还是小于 m,而范围检查并知道流的确切大小 您可以读取此处返回的流实现的源代码,而返回的流实现 在此方法中。Arrays.streamStream.of(array).skip(n).limit(m)limit(m)Arrays.streamArrays.stream(array,start,end)Stream.of(array).skip().limit()


答案 2

@sol4me解决方案的替代方案:

Stream.of(theArray)

关于这 和 之间的区别:如果您的数组是基元类型,它确实会有所不同。例如,如果您执行以下操作:Arrays.stream()

Arrays.stream(someArray)

其中 是 ,它将返回 .,则返回具有单个元素的 。someArraylong[]LongStreamStream.of()Stream<long[]>