Автор оригинала: Olivera Popović.
Вступление
Условные операторы и циклы являются очень важным инструментом в программировании. Существует не так много вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.
Вот что означает “управление потоком” – руководство выполнением нашей программы, вместо того, чтобы позволять ей выполняться построчно независимо от каких-либо внутренних или внешних факторов. Каждый язык программирования поддерживает ту или иную форму управления потоком, если не явно с помощью if s и для s или аналогичных операторов – тогда он неявно предоставляет нам инструменты для создания таких конструкций, т. Е. Языки программирования низкого уровня обычно достигают того, что влияет на множество команд go-to .
Циклы были концепцией, используемой задолго до того, как компьютерное программирование вообще стало чем – то, но первым человеком , использовавшим программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией Байрон, при вычислении чисел Бернулли , еще в 19 веке.
В Java существует несколько способов управления потоком кода:
- утверждения if и if-else
- операторы переключения
- операторы while и do-while
- для и улучшено для заявлений
- прервите и продолжите выступления
Инструкция switch
Если мы хотим сравнить значение с несколькими значениями и выполнить код на основе их равенства, мы могли бы сделать что-то в духе:
String input = "someCommand";
if (input.equals("date")) {
System.out.println("The current date is: " + new Date());
} else if (input.equals("help")) {
System.out.println("The possible commands are...");
} else if (input.equals("list")) {
System.out.println("The files in this directory are...");
} else if (input.equals("exit")) {
System.out.println("Exiting application...");
} else {
System.out.println("Command Not Supported");
}
Это может быстро стать громоздким и нечитаемым. Оператор switch был представлен нам именно для того, чтобы избежать этого, когда это возможно. Этот оператор используется, когда у нас есть несколько разных вещей, которые мы хотим выполнить, основываясь на значении одного выражения:
switch(variable) {
case constant1:
// Do something if the variable is equal to constant1.
// constant1 must be of same type as variable
// or easily converted to, such as Integer -> int
break;
case constant2:
// Some code
break;
...
default:
// Some code
break;
}
Переменная, переданная в качестве аргумента switch , является переменной или выражением, значение которого мы сравниваем. Это значение сравнивается с каждым из значений case . Если переменная, которую мы проверяем, соответствует какому-либо из случаев, выполняется код, следующий за этим случаем. У нас может быть столько случаев утверждений, сколько мы захотим.
Здесь мы познакомились с четырьмя новыми ключевыми словами: переключатель , случай , разрыв и по умолчанию .
переключатель
Оператор switch обычно принимает переменную, хотя он также может принимать выражение, если оно возвращает принятый тип:
// Comparing the value 5 with case values
switch(5) {
// Cases
}
int x = 5;
int y = 10;
// Comparing the value 15 with case values
switch(x+y) {
// Cases
}
// Booleans are not supported by switch statements,
// so this won't compile
switch(!true) {
// Cases
}
Если мы передадим значение null в переключатель , возникнет исключение NullPointerException//.
дело
Значение метки case должно быть константой времени компиляции . Это означает, что для всех значений case мы должны либо использовать литералы/константы (т. Е. “abc”, 5 и т.д.), Либо переменные, которые были объявлены окончательными | и присвоили значение:
final int i = 5;
int y = 15;
final int z;
z = 25;
int x = 10;
switch(x) {
case i:
// i can't be changed at any point due to the
// `final` modifier, will compile
break;
case y:
// Won't compile as `y` isn't a compile-time constant
break;
case 10+10:
// Compiles, as 10+10 is a compile-time constant
break;
case z:
// Doesn't compile as z wasn't initialized with
// its declaration, thus it isn't considered to
// be a compile-time constant
break;
case null:
// Doesn't compile, there can't be a null case
break;
}
Все случаи должны быть уникальными, иначе Java-код не будет компилироваться. Если бы случаи не были уникальными, не было бы никакого способа узнать, какой случай следует выполнить среди повторяющихся значений.
перерыв
Ключевое слово break используется для прерывания потока кода в случаях. Как только оператор switch найдет регистр, соответствующий переданной переменной, он продолжит выполнение кода регистра до тех пор, пока не будет найдено первое ключевое слово break или не закончится сам блок switch .
Например:
int ourNumber = 1;
switch(ourNumber) {
case 1:
System.out.println("One");
case 2:
System.out.println("Two");
case 3:
System.out.println("Three");
break;
case 4:
System.out.println("Four");
}
Вывод этого кода является:
One Two Three
В этом примере поток выполнения “проходит” от первого оператора case (который соответствовал номеру года значению) до оператора break .
Иногда это может привести к выполнению нежелательных обращений, поэтому мы должны быть осторожны при добавлении операторов break , и хорошей идеей будет добавлять их по умолчанию в каждом случае и удалять их позже , если мы хотим выполнить несколько обращений для некоторых входных данных. Более подробную информацию о заявлении break можно найти здесь .
Если бы мы хотели, чтобы один и тот же код выполнялся для нескольких случаев, это был бы обычный используемый шаблон:
...
case "a":
case "b":
System.out.println("Variable is equal to constant1 or constant2!");
break;
...
Это приведет к выполнению строки System.out.println , если наша переменная равна "a" | или , если она равна “b” .
по умолчанию
По умолчанию случай-это фрагмент кода, который переключается выполняется, если переменная, которую мы передали ей, не соответствует ни одному из заданных случаев. Это утверждение является необязательным, хотя настоятельно рекомендуется избегать ситуаций, когда ввод, определенный пользователем, нарушает весь поток приложения.
Принятые Типы Данных
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Переменная |, переданная в качестве аргумента switch , может быть одной из следующих:
- обуглить
- байт
- короткий
- инт
- Целое число
- Короткий
- Байт
- Характер
- перечисление
- Строка
Это огромный скачок от операторов if и else-if , которые поддерживают только логические выражения.
Тем не менее, мы можем легко переписать пример if /| if-else из начала этой статьи:
switch("someCommand") {
case "date":
System.out.println("The current date is: " + new Date());
break;
case "help":
System.out.println("The possible commands are...");
break;
case "list":
System.out.println("The files in this directory are...");
break;
case "exit":
System.out.println("Exiting application...");
break;
default:
System.out.println("Command Not Supported");
break;
}
Или, в качестве другого примера, мы могли бы передать целое число и заменить эту цепочку блоков if и else-if более читаемым аналогом:
int ourNumber = 4;
if (ourNumber == 1) {
System.out.println("One");
}
else if (ourNumber == 2) {
System.out.println("Two");
}
else if (ourNumber == 3) {
System.out.println("Three");
}
else if (ourNumber == 4) {
System.out.println("Four");
}
else {
System.out.println("Larger than 4");
}
Эквивалентная инструкция switch будет выглядеть следующим образом:
switch(ourNumber) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
case 3:
System.out.println("Three");
break;
case 4:
System.out.println("Four");
break;
default:
System.out.println("Larger than 4");
break;
}
Понятно, что если наше число равно 1, то код после случая 1: будет выполнен, и “Один” будет выведен на стандартный вывод.
Примечание: В отличие от других типов данных, строки сравниваются не с оператором == , а с методом .equals() при проверке всех случаев. Это делается для того, чтобы сравнивались фактические значения строк, а не расположение в памяти.
Вложенные операторы переключения
Мы можем вложить несколько операторов switch .
switch(var1) {
case constant1:
switch(var2) {
// ...
}
break;
case constant2:
...
}
Лямбда-выражения
В Java 12 появился новый, более лаконичный способ обработки операторов switch с использованием лямбда-выражений.
При использовании операторов switch таким образом, разрывы больше не требуются, а возвращаемое значение становится более читаемым. В настоящее время это доступно только в качестве опции предварительного просмотра . Типичный новый тип переключателя будет выглядеть примерно так:
switch(ourNumber) {
case 7, 3, 8, 4 -> System.out.println("Very popular lucky number");
case 5, 13, 9, 6 -> System.out.println("Kind of popular lucky number");
default -> System.out.println("Not all that popular");
}
// Or something like:
String s = switch(ourNumber) {
case 7, 3, 8, 4 -> "Very popular lucky number";
// ...
}
System.out.println(s);
Вывод
Управление потоком в коде необходимо абсолютно для каждого приложения. Заявления, которые изменяют поток кода, являются фундаментальными строительными блоками, и каждый начинающий разработчик должен полностью контролировать/осознавать, как они работают.