我想知道stream().toArray[x -> new Integer[x]] 如何知道数组的大小?我写了一个片段,其中创建了一个大小为 4 的整数列表并过滤了值,它创建了一个过滤流长度的数组,我在流上看不到任何方法来获取流的大小。
List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
intList.add(2);
intList.add(3);
intList.add(4);
Integer[] array = intList.stream()
.filter(x -> x > 2)
.toArray(x -> {
System.out.println("x --> " + x);
return new Integer[x];
});
System.out.println("array length: " + array.length);
上述代码的输出:
x --> 2
array length: 2
最初,该片段就像
Integer[] array = intList.stream()
.filter(x -> x > 2)
.toArray(x -> new Integer[x]);
只是为了了解它传递的 x 值,我必须将其更改为在 lambda 中打印 x
当然,这取决于实现。对于某些流,如果源具有已知大小并且不涉及大小改变中间操作,则大小是可预测的。由于您正在使用filter
操作,这不适用,但是,有一个基于未过滤计数的估计大小。
现在,Stream 实现只需分配一个临时缓冲区,使用估计大小或默认大小,并支持增加容量(如有必要),然后在最后一步中将数据复制到由函数创建的目标数组中。
中间缓冲区可以通过提供的函数创建,这就是为什么文档状态 ”…使用提供的生成器函数分配返回的数组,以及分区执行或调整大小可能需要的任何其他数组” 我依稀记得在早期版本中看到过这样的行为。然而,当前的实现仅使用Object[]
数组(或Object[][]
in a “脊柱缓冲区”)用于中间存储,并仅使用提供的函数创建最终数组。因此,考虑到这个特定的 JRE 实现,您无法使用该函数观察中间数组的创建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)