当前位置:  开发笔记 > 编程语言 > 正文

为什么Stream.limit在此代码段中没有按预期工作?

如何解决《为什么Stream.limit在此代码段中没有按预期工作?》经验,为你挑选了4个好方法。

由于只有4个元素通过过滤器,因此limit(10)永远不会达到10个元素,因此Stream管道不断生成新元素并将它们提供给过滤器,尝试达到通过过滤器的10个元素,但由于只有前4个元素通过了过滤器,处理永远不会结束(至少直到i溢出).

Stream管道不够智能,不知道没有更多元素可以通过过滤器,因此它会继续处理新元素.



1> Eran..:

由于只有4个元素通过过滤器,因此limit(10)永远不会达到10个元素,因此Stream管道不断生成新元素并将它们提供给过滤器,尝试达到通过过滤器的10个元素,但由于只有前4个元素通过了过滤器,处理永远不会结束(至少直到i溢出).

Stream管道不够智能,不知道没有更多元素可以通过过滤器,因此它会继续处理新元素.



2> Mureinik..:

翻转limitfilter子句有不同的行为.

如果放置第limit一个,则流将首先生成10个整数[1..10],然后过滤它们,只留下小于5的整数.

在原始排序中,filter首先应用整数,生成并过滤整数,直到达到10个元素.这不是一个无限的运营商,因为i供应商最终会溢出,但需要一段时间,特别是在慢速计算机上,才能达到MAX_INT.


我没有考虑最终的int溢出.+1

3> Tagir Valeev..:

如果你想停止或者如果达到编号为5或10种元素收集,还有Stream.takeWhile()在Java的9添加方法:

List integer = Stream.generate(new Supplier() {
    int i = 0 ;

    @Override
    public Integer get() {
        return ++i;
    }
}).takeWhile(j -> j < 5).limit(10).collect(Collectors.toList());



4> Oliv..:

在供应商溢出并开始产生负数后,它将完成.结果列表将包含:

[1, 2, 3, 4, -2147483648, -2147483647, -2147483646, -2147483645, -2147483644, -2147483643]

其原因在于其他答案.在我的i7机器上完成需要40秒.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有