Java 为什么';t Stream.limit是否按此代码段中的预期工作? List integer=Stream.generate(新供应商(){ int i=0; @凌驾 公共整数get(){ return++i; } }).过滤器(j->jji+1)。filter(…)…而不是这个时髦的供应商。@alexic。我不知道这个API。谢谢!或者更好的是IntStream.range()。流管道不够聪明,无法知道没有更多的元素可以通过过滤器“…事实上。 [1, 2, 3, 4, -2147483648, -2147483647, -2147483646, -2147483645, -2147483644, -2147483643]

Java 为什么';t Stream.limit是否按此代码段中的预期工作? List integer=Stream.generate(新供应商(){ int i=0; @凌驾 公共整数get(){ return++i; } }).过滤器(j->jji+1)。filter(…)…而不是这个时髦的供应商。@alexic。我不知道这个API。谢谢!或者更好的是IntStream.range()。流管道不够聪明,无法知道没有更多的元素可以通过过滤器“…事实上。 [1, 2, 3, 4, -2147483648, -2147483647, -2147483646, -2147483645, -2147483644, -2147483643],java,java-8,java-stream,Java,Java 8,Java Stream,与我的预期相反,collect调用从未返回。在过滤器之前设置限制,将产生预期结果。为什么? 由于只有4个元素通过过滤器,limit(10)永远不会达到10个元素,因此流管道不断生成新元素并将它们馈送到过滤器,试图达到10个通过过滤器的元素,但由于只有前4个元素通过过滤器,因此处理永远不会结束(至少在i溢出之前) 流管道不够聪明,无法知道没有更多的元素可以通过过滤器,因此它会继续处理新的元素。翻转限制和过滤器子句具有不同的行为 如果您首先放置限制,流将首先生成10个整数[1..10],然后过滤它们

与我的预期相反,
collect
调用从未返回。在
过滤器
之前设置
限制
,将产生预期结果。为什么?

由于只有4个元素通过过滤器,
limit(10)
永远不会达到10个元素,因此流管道不断生成新元素并将它们馈送到过滤器,试图达到10个通过过滤器的元素,但由于只有前4个元素通过过滤器,因此处理永远不会结束(至少在
i
溢出之前)


流管道不够聪明,无法知道没有更多的元素可以通过过滤器,因此它会继续处理新的元素。

翻转
限制
过滤器
子句具有不同的行为

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

在原始排序中,首先应用
过滤器
,生成并过滤整数,直到达到10个元素。这不是一个无限运算符,因为供应商中的
i
最终将溢出,但如果要停止它,需要一段时间才能达到
MAX_INT
,特别是在速度较慢的计算机上呃如果达到第5个或收集了10个元素,那么Java-9中添加了
Stream.takeWhile()
方法:

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

    @Override
    public Integer get() {
        return ++i;
    }
}).filter(j -> j < 5)
  .limit(10)   // Note the call to limit here
  .collect(Collectors.toList());
List integer=Stream.generate(新供应商(){
int i=0;
@凌驾
公共整数get(){
return++i;
}
}).takeWhile(j->j<5).limit(10).collect(collector.toList());

在供应商溢出并开始生成负数后,它将结束。生成的列表将包含:

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

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

原因是在其他的答案。在我的I7机器上花费了40秒的时间完成。

我没有考虑最终的int溢出。+1可能是关于优化器启动的时候,但是在我的机器上,溢出和随后的操作完成在不到一秒钟内……你可能会使用<代码> Stream.it。rate(1,i->i+1)。filter(…)…而不是这个时髦的供应商。@alexic。我不知道这个API。谢谢!或者更好的是IntStream.range()。
管道不够聪明,无法知道没有更多的元素可以通过过滤器“…事实上。
[1, 2, 3, 4, -2147483648, -2147483647, -2147483646, -2147483645, -2147483644, -2147483643]