Java 8 stream 的 toArray 和 size 参数

标签 java lambda java-8 java-stream

我想知道 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 实现简单地分配一个临时缓冲区,使用估计大小或默认大小并支持增加容量,如果需要,并将数据复制到目标数组中,由您的函数创建,在最终步骤。

可以通过提供的函数创建中间缓冲区,这就是 the documentation 的原因声明“......使用提供的生成器函数分配返回的数组,以及分区执行或调整大小可能需要的任何其他数组”,我依稀记得在早期版本中看到过这样的行为.但是,当前实现仅使用 Object[] 数组(或 “spined buffer” 中的 Object[][])进行中间存储,并仅使用提供的函数来创建最终数组。因此,鉴于此特定的 JRE 实现,您无法观察到使用该函数创建中间数组。

关于Java 8 stream 的 toArray 和 size 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42270748/

相关文章:

java - Spring Security 4. 具有自定义身份验证和授权的 JSON REST

Java单例类与最终类

c# - 如何使用 lambda 表达式和 linq 从范围中获取元素?

java - 谷歌应用引擎: Map parameter becomes JSonMap

python - 高阶函数 - 接收 lambda 函数进行导数计算

c# - ASP.NET,剑道用户界面,CS1660 : Cannot convert lambda expression to type 'string'

java - 在 Java 中从 Optional->List->List 转换的链方法

Java 8 映射集合并在集合为空时添加默认值

java - 使用 TextWatcher 获取输入到两个编辑文本中的值,并在没有按钮的情况下将这些值相乘。自动计算。

java - Java中向循环双向链表添加节点