【问题标题】:How to re-write `while(true)` in Java Stream API [closed]如何在 Java Stream API 中重写`while(true)` [关闭]
【发布时间】:2019-10-16 13:11:12
【问题描述】:

这个 Java 代码可以用 Stream API 重写吗?

while (true) {
    ...
    if (isTrue()) break;
}

private boolean isTrue() {
    ...

【问题讨论】:

  • 为什么需要?循环有什么问题?你真的有数据元素流吗?
  • 这里的流在哪里出现?
  • 我不需要,但我想知道是否可以。
  • 你可能会滥用流来做到这一点,使用合适的map()anyMatch()/allMatch()。但是为什么还要编写糟糕的代码呢?
  • @Kayaman 谢谢,我没有看到或需要重新搜索它。今天学到了一些新东西:)

标签: java java-8 java-stream


【解决方案1】:

这是可怕的代码,没有理由使用它。流是常规循环的附加工具,它们不能替代 for 尤其是 while 循环。

// If you use this code seriously somewhere, I will find you
IntStream.generate(() -> 0)
    .peek(i -> {
        // Any custom logic
        System.out.println(i);
    })
    .noneMatch(i -> isTrue());

代码无限生成零,在流中窥视以执行自定义逻辑,然后在 noneMatch 计算结果为 true 时停止。

上面相当于问题中的代码,可以更简洁地写成

do {
    // custom logic
} while(!isTrue());

【讨论】:

  • 我觉得好脏。
  • 谢谢!我确认这符合我的预期。
  • @blackeyedcenter 现在你必须创建一个pinky swear 永远不要使用它。
【解决方案2】:

您不能使用 Stream API 替换或重写 while 循环。 Stream API 从 Stream 中读取值。 while (true) 没有从任何流中读取数据。这只是一个无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2019-06-14
    • 2010-09-07
    • 1970-01-01
    • 2017-07-07
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多