【问题标题】:When should I use a 'while loop'?我什么时候应该使用“while 循环”?
【发布时间】:2011-11-12 21:21:34
【问题描述】:

我只是偶然发现了这个问题Are "while(true)" loops so bad?
他们让我思考我通常做什么。令我惊讶的是,我意识到我几乎从未在我的专业代码(或工作代码)中使用过while loop
前端框架,例如人脸等不计算在内。
那么我什么时候应该使用'while循环'?和 你多久使用一次while循环?
这是一个真正的问题,请不要因为主观而结束我真的是在一个具体的例子之后。它不能用更好的替代品代替。

【问题讨论】:

  • 这个问题是关于while 的具体情况,即while(true),但while 通常,您可以随时使用它,在幕后它几乎与for 循环完全相同。
  • 确实,请不要混淆while (true) {}(这是一个无限循环,被一些开发人员认为是不好的做法)和while (someSpecificConditionWhichIsNeverUnchanged) {}(非常好)。

标签: java while-loop


【解决方案1】:

当然,您总是可以将 while 循环重写为 for 循环,但它通常更丑陋,这意味着 for (..;..;..) 的部分内容留空 - 主要是初始化。 Findbugs 在这种情况下也会发出警告:类似于“检测到简单的 for 循环,将其重写为 while 循环”。

while循环的主要应用是你不需要初始化,或者想特别对待第一个循环迭代(例如枚举的第一个元素),在这种情况下你也可以预先进行初始化。

【讨论】:

    【解决方案2】:

    当您不知道需要多少次迭代时,您应该使用它。 你只有在满足你的条件时才知道你想做某事。它可以迭代 2、100、0... 次。

    【讨论】:

      【解决方案3】:

      当你的代码中有一个主循环,你想运行它直到发生变化时使用它。

      当您不需要计数器,并且当您不需要迭代集合时(因为那时您需要计数器)。

      使用 for(;whatever;) 是丑陋的代码,这就是你必须使用一段时间的地方。

      还有变体,do ... while 允许你做某事至少一次,然后可能多次。

      【讨论】:

        【解决方案4】:

        我可能会使用它的一个地方是您需要将序列的第一个元素与其他元素区别对待。这使得 foreach 循环很尴尬,但 while 循环运行良好:

        Iterator<String> iterator = foo.iterator();
        
        // Handle the first item specially
        if (!iterator.hasNext()) {
            throw new SomeException("foo shouldn't be empty");
        }
        SomeResult result = new SomeResult(iterator.next());
        
        // Now deal with the rest
        while (iterator.hasNext())
        {
            String item = iterator.next();
            result.addItem(item);
        }
        

        我还使用while 循环作为我还将在条件中包含赋值的少数几个地方之一:

        String line;
        while ((line = reader.readLine()) != null)
        {
            // Handle the line
        }
        

        InputStream:

        int bytesRead;
        while ((bytesRead = input.read(buffer)) != -1)
        {
            // Handle the buffer
        }
        

        【讨论】:

        • Accept 'readLine' example 它确实需要它。真正的用法。但是你认为这些天仍然使用迭代器。这个陈述更多的是一个问题而不是争论。
        • @Java Ka Baby:它们被大量使用,是的,但通常在增强的 for 循环中。有时,以不同的方式处理第一项是有用的(例如,当您试图找到最大值/最小值时获取初始值),此时手动执行有时可能是最简单的方法。 (在 C# 中也是如此。)
        【解决方案5】:

        简单的永不停止的后端逻辑:

        while (true) {
          consumeMessage();
        }
        

        也可以

        for (;;) {
          consumeMessage();
        }
        

        【讨论】:

          【解决方案6】:
          java.util.Scanner scanner = //...
          
          while(scanner.hasNextLine()) {
            String line = scanner.nextLine();
            //..do sth with the line
          }
          

          实际上每个while 循环都可以替换为for。但是例如在上面的代码中,它的可读性会降低 - 这就是重点:当它更适合问题的性质时使用 while

          【讨论】:

          • 这适用于使用枚举而不是迭代器的旧 API。并不真正影响OP的问题。
          • 是的,虽然好的例子不成立,或者我应该说这些天没有使用过。仍然 +1 来提高它。
          【解决方案7】:

          当某些条件成立时,您应该使用它来循环。

          【讨论】:

            猜你喜欢
            • 2013-01-17
            • 1970-01-01
            • 1970-01-01
            • 2021-09-07
            • 2012-09-22
            • 1970-01-01
            • 2010-10-02
            • 2014-10-20
            • 2012-12-23
            相关资源
            最近更新 更多