Java Streams Api,有限流

时间:2018-11-07 17:28:21

标签: java java-8 java-stream

我正在尝试通过使用Java Streams API创建斐波那契序列。我已经创建了一个供应商,但希望它停止在特定值(例如1000000)。

前者:

import java.util.function.Supplier;

public class FibonacciSupplier implements Supplier<Integer> {

    private int current;
    private int next;

    public FibonacciSupplier() {
        current = 0;
        next = 1;
    }

    @Override
    public Integer get() {
        int result = current;
        current = next + current;
        next = result;
        return result;
    }
}

我希望它是:

Stream.generate(new FibonacciSupplier()).maxValue(1000000);

maxValue作为函数不存在,我将其用作上下文的名称。

2 个答案:

答案 0 :(得分:3)

最好的解决方案是使用Java 9+中可用的takeWhile

Stream.generate(new FibonacciSupplier())
    .takeWhile(i -> i <= 1000000) //will stop stream when value exceeds given limit
    .forEach(System.out::println);

如果您使用的是Java 8,则可能需要研究hacks for stopping an infinite stream

答案 1 :(得分:0)

您将需要在流上使用.limit()方法,如下所示:

Stream.generate(new FibonacciSupplier()).limit(1000).forEach(System.out::println);

从文档中

  

返回由该流的元素组成的流,被截断   长度不得超过{@code maxSize}。