Когда я должен использовать цикл while? - PullRequest
1 голос
/ 08 сентября 2011

Я только что наткнулся на этот вопрос Так ли плохо работает "while (true)"?
Они заставили меня задуматься, что я обычно делаю. И к своему удивлению я понял, что почти никогдаиспользовал while loop в моем профессиональном коде (или рабочем коде).
Рамки переднего конца, например, грани и т. Д., Не учитываются.
Итак, когда я должен использовать цикл while?и как часто вы используете цикл while?
Это реальный вопрос, пожалуйста, не закрывайте его, поскольку я субъективен. Я действительно нахожусь после конкретного примера. Там, где его нельзя заменить на лучший альтернативный вариант.

Ответы [ 7 ]

7 голосов
/ 08 сентября 2011

Единственное место, где я мог бы использовать его, это то, где вам нужно трактовать первый элемент последовательности иначе, чем остальные. Это делает цикл 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
}
3 голосов
/ 08 сентября 2011
java.util.Scanner scanner = //...

while(scanner.hasNextLine()) {
  String line = scanner.nextLine();
  //..do sth with the line
}

Фактически каждый цикл while можно заменить на for.Но, например, в приведенном выше коде он будет менее читабельным - и в этом все дело: используйте while, когда это лучше соответствует характеру проблемы.

1 голос
/ 08 сентября 2011

Конечно, вы всегда можете переписать цикл while в цикл for, но часто он уродливее, что означает, что части for (..; ..; ..) оставлены пустыми - в основном это инициализация. Findbugs также выдает предупреждение в этом случае: похоже на «обнаружен простой цикл for, перепишите его как цикл while».

Основное применение цикла while заключается в том, что вам не требуется инициализация или вы хотите специально обработать итерацию первого цикла (например, первый элемент перечисления), и в этом случае вы также выполняете инициализацию заранее.

1 голос
/ 08 сентября 2011

Вы должны использовать его, когда вы не знаете, сколько итераций потребуется. Вы знаете только, что хотите что-то сделать, пока выполняется ваше условие. Это может быть повторено 2, 100, 0 ... раз.

1 голос
/ 08 сентября 2011

Простая бесконечная логика бэкэнда:

while (true) {
  consumeMessage();
}

Или также

for (;;) {
  consumeMessage();
}
1 голос
/ 08 сентября 2011

Вы должны использовать его для цикла, пока выполняется некоторое условие.

0 голосов
/ 08 сентября 2011

Используйте его, когда в вашем коде есть основной цикл, который вы хотите запустить, пока что-то не изменится.

Когда вам не нужен счетчик, и когда вам не нужно перебирать коллекцию (потому что тогда вам нужен счетчик).

Использование for (; что угодно;) - ужасный кодвот где вы должны использовать некоторое время.

Также вариант do ... while позволяет вам делать что-то хотя бы один раз, а затем, возможно, много раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...