【问题标题】:Transforming a while loop to a stream in Java 8在 Java 8 中将 while 循环转换为流
【发布时间】:2018-08-11 02:13:29
【问题描述】:

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

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

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

    return i;
}

【问题讨论】:

  • 你认为为什么需要转换这么简单的循环?当你“运气不佳”时,你遇到了什么问题?当int 值范围内没有下一个素数时,您的方法应该做什么?目前的溢出行为看起来不太令人信服。
  • @Holger “作为练习……”

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


【解决方案1】:

除了利用并行性之外,我认为没有理由为此使用 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,如方法引用所示。您应该将其更改为您的班级名称。

【讨论】:

  • 无限流永远不能返回一个空的可选项。
  • 没错,我会更好地传达这一点。
  • @Aominè 很好,我忘了get 不是OptionalInt ;)
  • 我意识到不需要流。我只是想学习函数式编程来转换我知道已经有效的代码。您提供的代码帮助很大。我正在慢慢理解它。
  • 我更喜欢IntStream.rangeClosed(number+1, Integer.MAX_VALUE);它更有效,并且在没有更大素数时抛出NoSuchElementException 的行为比溢出更合理......
【解决方案2】:

基于this answer,对于像Enumeration<T>这样的对象,你只能调用.hasMoreElements()&.nextElement(),你可以使用这种代码:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多