Рубрики
Без рубрики

Управление потоком Java: операторы if и if-else

Автор оригинала: Olivera Popović.

Вступление

Условные операторы и циклы являются очень важным инструментом в программировании. Существует не так много вещей, которые мы могли бы сделать с кодом, который может выполняться только построчно.

Вот что означает “управление потоком” – руководство выполнением нашей программы, вместо того, чтобы позволять ей выполняться построчно независимо от каких-либо внутренних или внешних факторов. Каждый язык программирования поддерживает ту или иную форму управления потоком, если не явно с помощью if s и для s или аналогичных операторов – тогда он неявно предоставляет нам инструменты для создания таких конструкций, т. Е. Языки программирования низкого уровня обычно достигают того, что влияет на множество команд go-to .

Циклы были концепцией, используемой задолго до того, как компьютерное программирование вообще стало чем – то, но первым человеком , использовавшим программный цикл, была Ада Лавлейс, широко известная под своей девичьей фамилией Байрон, при вычислении чисел Бернулли , еще в 19 веке.

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

В Java существует несколько способов управления потоком кода:

  • утверждения if и if-else
  • операторы переключения
  • операторы while и do-while
  • для и улучшено для заявлений
  • прервите и продолжите выступления

Заявление if

Оператор if , вероятно, является наиболее распространенной формой управления потоком, независимо от языка. Это очень просто и интуитивно понятно:

if(true) {
    //execute this code block if the argument/expression is true
    //some more code
}

Поскольку во многих случаях требуется выполнить только одну строку, вы можете пропустить использование фигурных скобок и блока кода и просто сделать отступ в следующей строке, хотя это работает только для одной строки :

if(true) 
    System.out.println("Inside the if block");
	System.out.println("I have nothing to do with the if block!");
System.out.println("Neither do I!");

Как правило, мы не вводим логические значения, как в этих примерах, а скорее используем выражение:

if(username != null)
    System.out.println(username);
if(argument >= 10) 
    System.out.println("The input is higher or equal than 10");

Если выражение false , код, принадлежащий оператору if , просто пропускается:

if(1 > 5)
    System.out.println("Hello");
System.out.println(" World!");

И результат таков:

 World!

Оператор if-else

Мы редко хотим просто пропустить фрагмент кода, если выражение оценивается как ложное . Как правило, мы хотим сделать что-то еще в этом случае:

if(expression) {    
    //code that executes only if the expression is true
}
else {// optional
    //code that executes only if the expression is false
}

Конечно, вы можете использовать оператор else в сочетании с сокращенным оператором if :

if(expression) 
    //code that executes only if the expression is true
else
    //code that executes only if the expression is false    

Однако это не рекомендуется, если вы не имеете дело с простыми операторами, особенно с вложенными if s, поскольку трудно понять, “к какому if принадлежит конкретный еще “. Использование скобок устранит двусмысленность проблемы, если вы сочтете этот подход нечитаемым.

Оператор else является необязательным, поэтому нет необходимости писать пустой блок else {} , если мы не хотим, чтобы что-либо произошло, если выражение | является ложным.

Оператор else внутренне связан с оператором if и не может существовать без него. Он должен появиться сразу после оператора if , иначе появится ошибка компилятора “иначе без if”.

В большинстве случаев мы хотим сравнить что – то на предмет равенства-имеет ли одна переменная то же значение, что и другая, или она меньше/больше другой:

String s = "smol";

if (s.length() > 8)
    System.out.println("s has too many characters!");
else 
    System.out.println("Ok, so basically, s is very " + s);

Оператор > здесь имеет обычное значение “больше, чем”, и Java поддерживает обычную группу реляционных операторов . К ним относятся < , > , <= , => , == проверяет равенство и != проверяет неравенство.

Примечание: Обязательно используйте == в если операторы вместо = , иначе вы можете присвоить значение вместо сравнения.

2 < 5   //true
2 < 2   //false
2 <= 2  //true
2 == 3  //false
2 != 3  //true

Примечание: Большую часть времени мы сравниваем Строковые переменные не с помощью == , а с помощью метода .equals () . == проверяет равенство ссылок на объекты. Для примитивных типов ( int , char и т.д.) Это то же самое , что проверять, имеют ли они одинаковое значение, но со строками это чаще всего не так.

if(string1.equals(string2))
    //code to be executed if the strings are equal by value

Вложенные операторы if

Мы можем подключить более одного if оператора, либо вложив (поместив один if оператор внутри другого), либо добавив еще, если в конце нашего предыдущего если :

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

int ourNumber = 10;

if(ourNumber > 8){ 
    if(ourNumber % 2 == 0){
       System.out.println("The number is larger than 8 and even");
    }
}
else if (ourNumber == 1) {
    System.out.println("1 is less than 8, so the previous if block isn't executed");
}
else {
    System.out.println("ourNumber is less than 8 and different than 1");
}

еще блоки всегда “принадлежат” если одного и того же уровня, поэтому еще если (ваш номер) в вашем коде принадлежит если(наше число > 8) , а не вложенному если , который проверяет, четное ли число.

У вас может быть столько еще, если блоков, сколько вы хотите, но только один еще блок, который идет последним. Каждый если , еще, если и еще блок, который оценивается как true , будет выполнен:

Несколько выражений в одном операторе if

Еще одна очень полезная вещь-возможность проверять несколько условий в одном если :

int ourNumber = 10;

if(ourNumber > 5 && (ourNumber % 2 == 0)){
    System.out.println("The number is larger than 8 and even");
}

Оператор && является одним из логических операторов , поддерживаемых Java. BoolExpr используется в качестве сокращения для логического выражения . Напоминание: логическое выражение-это выражение , которое может быть оценено как true или false , т. Е. оно также может быть выражением, содержащим логический оператор, как мы можем видеть здесь:

  • !BoolExpr! является отрицанием, оно оценивает выражение true в false и наоборот.
  • bool Expr1 & bool Expr2 – оператор И принимает значение true , если оба выражения истинны .
  • bool Expr1 | bool Expr2 – оператор ИЛИ принимает значение true , если по крайней мере одно из выражений истинно .
  • bool Expr1 && bool Expr2 – оператор короткого замыкания | И принимает значение true только в том случае, если boolExpr1 и bool Expr2 оба истинны . Это называется оператором короткого замыкания , потому что, если первое выражение ложно , оно даже не будет оценивать второе выражение как основное условие, которое оба должны быть истинными никогда не может произойти. С помощью простых выражений это не влияет на код значимым образом, но в производственном коде оба выражения могут быть дорогостоящими операциями, и такой подход может значительно оптимизировать код. bool Expr1
  • bool Expr2 – оператор короткого замыкания | ИЛИ принимает значение true , если по крайней мере один из boolExpr1 и bool Expr2 является истинным . A короткое замыкание версия | оператора. bool Expr1 ^ bool Expr2
  • - оператор XOR принимает значение true только в том случае, если boolExpr1 и bool Expr2 оцениваются по-разному, т. Е. Если только один из них истинен , а другой ложен .
true && false //false
(2 < 5) && (2 != 3) //true
false || true //true
true && ((false || false) ^ true) //true
(true && false) || false // false

Настоятельно рекомендуется использовать круглые скобки всякий раз, когда это имеет смысл. Последний пример работает так же без круглых скобок, но полагаться на приоритет оператора чрезвычайно рискованно и приводит к нечитаемому коду.

Троичные Конструкции

Единственным тернарным оператором (оператором, который принимает три операнда) в Java является оператор ?: . Это работает как очень компактное if-else заявление.

int max = 0;
if (a > b)
    max = a;
else max = b;

//can be written as
int max = (a > b) ? a : b; 

Вот как обычно выглядит троичная конструкция:

(expression) ? returnValueIfTrue : returnValueIfFalse

Троичные конструкции также могут работать без круглых скобок, хотя, как правило, скобки более удобочитаемы:

int max = a > b ? a : b;

Вы также можете использовать троичные конструкции для изменения переменных:

System.out.println("10% discount for orders above $50!");
double orderPrice = 55;
double finalPrice = orderPrice > 50 ? orderPrice*09 : orderPrice;
System.out.println("Your final price is $" + finalPrice);

И результат таков:

Your final price is $49.5

Используя конструкцию, мы также можем вызывать методы:

public void someMethod() {
    String userRole = "Admin";
    String result = userRole.equals("Admin") ? greetAdmin() : greetUser();
    System.out.println(result);
}

static String greetAdmin() {
    return "Hello Admin!";
}
static String greetUser() {
    return "Hello User!";
}

Логически это привело бы к:

Hello Admin!

Вложенные Троичные Конструкции

System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!");
double orderPrice = 140;
int quantity = 5;
double finalPrice = (orderPrice > 50) ? (quantity > 2) ? (orderPrice*0.9)-5 : orderPrice*0.9 : orderPrice;
System.out.println("Your final price is: $" + finalPrice);

Поскольку оба условия являются истинными , вывод будет:

10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!
Your final price is: $121.0

Однако этот подход ужасно нечитабелен. Если возможно, избегайте вложенности троичных конструкций, хотя, если необходимо, разбейте их на более простые блоки. Для примера, этот пример можно сделать немного более читабельным:

System.out.println("10% discount for all orders above $50 and additional $5 off if your order exceedes 2 items!");
double orderPrice = 140;
int quantity = 5;
double finalPrice = (orderPrice > 50) ?
                        (quantity > 2) ?
                                (orderPrice*0.9)-5 : orderPrice*0.9
                    : orderPrice;
System.out.println("Your final price is: $" + finalPrice);

Вывод

Управление потоком в коде необходимо абсолютно для каждого приложения. Такие утверждения, как if и if-else , являются фундаментальными строительными блоками, и каждый начинающий разработчик должен полностью контролировать/осознавать, как они работают.