32

32


public class ForEachString {

public static void main(String[] args) {

for(char с : "An African Swallow".toCharArray() ) System.out.print(c + " ");

}

} /* Output:

An African Swallow *///.-

Как будет показано далее, «синтаксис foreach» также работает для любого объекта, поддерживающего интерфейс Iterable.

Многие команды for основаны на переборе серии целочисленных значений:

for (int i = 0; i < 100; i++)

В таких случаях «синтаксис foreach» работать не будет, если только вы пред¬варительно не создадите массив int. Для упрощения этой задачи я включил в библиотеку net.mindview.util.Range метод range(), который автоматически гене¬рирует соответствующий массив:

//: control/ForEachlnt.java

import static net.mindview.util.Range.*,

import static net.mindview.util Print.*;

public class ForEachlnt {

public static void main(String[] args) { for(int i : range(10)) // 0..9

printnbCi + „ v).

printO;

for(int i : range(5, 10)) // 5..9

printnb(i +

printO;

for(int i : range(5. 20. 3)) // 5

printnbCi +

printO:

}

} /* Output: 0 12 3 4 5 6 7 8 9 5 6 7 8 9 5 8 11 14 17 *///:-

Обратите внимание на использование printnb() вместо print(). Метод printnb() не выводит символ новой строки, что позовляет построить строку по фраг¬ментам.

return

Следующая группа ключевых слов обеспечивает безусловный переход, то есть передачу управления без проверки каких-либо условий. К их числу относятся команды return, break и continue, а также конструкция перехода по метке, анало¬гичная goto в других языках.

У ключевого слова return имеется два предназначения: оно указывает, какое значение возвращается методом (если только он не возвращает тип void), а так¬же используется для немедленного выхода из метода. Метод test() из предыду¬щего примера можно переписать так, чтобы он воспользовался новыми возмож¬ностями:

//: control/IfElse2.java

import static net.mindview.util.Print.*:

public class IfElse2 {

static int test(int testval. int target) { if(testval <@062> target)

return +1; else if(testval < target) return -1;

else

return 0; // Одинаковые значения

}

public static void main(String[] args) { prmt(test(10. 5)); print(test(5. 10)): print(test(5. 5));

}

} /* Output: 1 -1 0

В данном случае секция else не нужна, поскольку работа метода не продол¬жается после выполнения инструкции return.

Если метод, возвращающий void, не содержит команды return, такая команда неявно выполняется в конце метода. Тем не менее, если метод возвращает лю¬бой тип, кроме void, проследите за тем, чтобы каждая логическая ветвь возвра¬щала конкретное значение.

break и continue

В теле любого из циклов вы можете управлять потоком программы, используя специальные ключевые слова break и continue. Команда break завершает цикл, при этом оставшиеся операторы цикла не выполняются. Команда continue оста¬навливает выполнение текущей итерации цикла и переходит к началу цикла, чтобы начать выполнение нового шага.

Следующая программа показывает пример использования команд break и con¬tinue внутри циклов for и while:

//: control/BreakAndContinue.java // Применение ключевых слов break и continue import static net.mindview.util.Range.*;

public class BreakAndContinue {

public static void main(String[] args) { for(int i = 0: i < 100; i++) {

if(i == 74) break; // Выход из цикла

if(i % 9 != 0) continue; // Следующая итерация

System.out print(i + " ");

}

System out.printlnO; // Использование foreach: for(int i : range(lOO)) {

if(i == 74) break; // Выход из цикла

if(i % 9 != 0) continue; // Следующая итерация

System.out.print(i + " ");

}

System.out.println(); int i = 0;

// "Бесконечный цикл": while(true) { i++;

int j = i * 27,

if(j == 1269) break; // Выход из цикла

if(i % 10 != 0) continue; 11 Возврат в начало цикла

System.out.print(i + " ");

}

}

} /* Output:

0 9 18 27 36 45 54 63 72 0 9 18 27 36 45 54 63 72 10 20 30 40 *///:-

В цикле for переменная i никогда не достигает значения 100 — команда break прерывает цикл, когда значение переменной становится равным 74. Обычно break используется только тогда, когда вы точно знаете, что условие выхода из цикла действительно достигнуто. Команда continue переводит исполнение в на¬чало цикла (и таким образом увеличивает значение i), когда i не делится без ос¬татка на 9. Если деление производится без остатка, значение выводится на эк¬ран.

Второй цикл for демонстрирует использование «синтаксиса foreach» с тем же результатом.

Последняя часть программы демонстрирует «бесконечный цикл», который теоретически должен исполняться вечно. Однако в теле цикла вызывается ко¬манда break, которая и завершает цикл. Команда continue переводит исполнение к началу цикла, и при этом остаток цикла не выполняется. (Таким образом, вы¬вод на экран в последнем цикле происходит только в том случае, если значе¬ние i делится на 10 без остатка.) Значение 0 выводится, так как 0 % 9 дает в ре¬зультате 0.

Вторая форма бесконечного цикла — for(;;). Компилятор реализует конст¬рукции while(true) и for(;;) одинаково, так что выбор является делом вкуса.

Нехорошая команда goto

Ключевое слово goto появилось одновременно с языками программирования. Действительно, безусловный переход заложил основы принятия решений в языке ассемблера: «если условие А, перейти туда, а иначе перейти сюда». Если вам доводилось читать код на ассемблере, который генерируют фактически все компиляторы, наверняка вы замечали многочисленные переходы, управ¬ляющие выполнением программы (компилятор Java производит свой собствен¬ный «ассемблерный» код, но последний выполняется виртуальной-машиной Java, а не аппаратным процессором).

Команда goto реализует безусловный переход на уровне исходного текста программы, и именно это обстоятельство принесло ей дурную славу. Если программа постоянно «прыгает» из одного места в другое, нет ли способа реор¬ганизовать ее код так, чтобы управление программой перестало быть таким «прыгучим»? Команда goto впала в настоящую немилость с опубликованием знаменитой статьи Эдгара Дейкстры «Команда GOTO вредна» (Goto considered harmful), их тех пор порицание команды goto стало чуть ли не спортом, а за¬щитники репутации многострадального оператора разбежались по укромным углам.

Report Page