在Java 8中将while循环转换为流

时间:2018-03-02 19:47:23

标签: java java-8 functional-programming java-stream

作为练习,我将一些旧代码转换为功能流。我不太了解溪流。转换此代码似乎应该很简单,但我没有太多运气。该方法从给定的整数开始,将其传递给isPrime,如果它是素数则返回true。然后放下要打印的新(下一个)素数。如果isPrime为false,则i递增,我们检查下一个整数。

private static int nextPrime(final int number) {
    int i = number + 1;

    while (!isPrime(i)) {
        i++;
    }

    return i;
}

2 个答案:

答案 0 :(得分:4)

我认为除了利用并行性之外没有理由使用Stream(如果素数恰好相差很远,但在int内这不是真的界限,所以基本上没有任何好处。

您可以迭代IntStream升序整数(从number + 1开始)并仅过滤素数。当不可避免地找到一个时,你可以返回第一个。

private static int nextPrime(final int number) {
    return IntStream.iterate(number + 1, i -> i + 1)
                    .filter(Test::isPrime)
                    .findFirst()
                    .getAsInt();
}

注意:我用来测试它的类称为Test,如方法参考所示。您应该将其更改为您的班级名称。

答案 1 :(得分:-1)

基于this answer,例如对于Enumeration<T>之类的对象,您只能调用.hasMoreElements().nextElement(),则可以使用以下代码:< / p>

public static <T> Stream<T> enumerationAsStream(Enumeration<T> e) {
    return StreamSupport.stream(
        new Spliterators.AbstractSpliterator<T>(Long.MAX_VALUE, Spliterator.ORDERED) {
            public boolean tryAdvance(Consumer<? super T> action) {
                if(e.hasMoreElements()) {
                    action.accept(e.nextElement());
                    return true;
                }
                return false;
            }
            public void forEachRemaining(Consumer<? super T> action) {
                while(e.hasMoreElements()) action.accept(e.nextElement());
            }
    }, false);
}