0
Обложка: Условные операторы в Java: if-else, switch и «Элвис»

Условные операторы в Java: if-else, switch и «Элвис»

Чтобы эффективно работать с условными операторами на языке Java, необходимо знать, какими они бывают и для каких сценариев подходят. Обсудим это и некоторые нововведения из Java 13.

  1. if
  2. if-else
  3. Вложенный if
  4. «Элвис»
  5. switch
  6. Задачи на условные операторы

Условный оператор if

Оператор if позволяет задать условие, в соответствии с которым дальнейшая часть программы может быть выполнена. Это основной оператор выбора, который используется в языке Java. Он начинается с ключевого слова if и продолжается булевым выражением — условием, заключённым в круглые скобки.

В качестве примера рассмотрим простое равенство, при истинности которого программа выведет результат:

if(2 * 2 == 4){
    System.out.println("Программа выполняется");
}

Поскольку условие истинно, в выводе программы мы увидим:

Программа выполняется

Условный оператор if-else в Java

else в языке Java означает «в ином случае». То есть если условие if не является истинным, выводится то, что в блоке else:

if(2 * 2 == 5){
    System.out.println("Программа выполняется");
} else{
    System.out.println("Условие ошибочно");
}

Вывод:

Условие ошибочно

Это же сработает и без ключевого слова else, но чтобы код был читабельным и логичным, не следует пренебрегать else, как это сделано в следующем примере:

if(2 * 2 == 5){
    System.out.println("Программа выполняется");
}
System.out.println("Условие ошибочно");

А теперь давайте создадим несколько условий с использованием конструкции if-else. Выглядит это таким образом:

int a = 20;

if(a == 10){
    System.out.println("a = 10");
} else if(a == 15){
    System.out.println("a = 15");
} else if(a == 20){
    System.out.println("a = 20");
} else{
    System.out.println("Ничего из перечисленного");
}

Вывод:

a = 20

Как видим, только третье условие истинно, поэтому выводится именно a = 20, а все остальные блоки игнорируются.

Вложенный if

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

int a = 20;
int b = 5;

if(a == 20){
    System.out.println("a = 20");
    if(b == 5){
        System.out.println("b = 5");
    }
}

Вывод:

a = 20
b = 5

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

«Элвис»

По сути, это сокращенный вариант if-else. Элвисом его прозвали за конструкцию, которая напоминает причёску короля рок-н-ролла — ?:. Данный оператор также принято называть тернарным. Он требует три операнда и позволяет писать меньше кода для простых условий.

Само выражение будет выглядеть следующим образом:

int a = 20;
int b = 5;

String answer = (a > b) ? "Условие верно" : "Условие ошибочно";
System.out.println(answer);

Вывод:

Условие верно

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

Условный оператор switch в Java

Оператор выбора switch позволяет сравнивать переменную как с одним, так и с несколькими значениями. Общая форма написания выглядит следующим образом:

switch(выражение) {
    case значение1:
        // Блок кода 1
        break;
    case значение2:
        // Блок кода 2
        break;
    case значениеN:
        // Блок кода N
        break;
    default :
        // Блок кода для default
}

Рассмотрим распространённый пример с днями недели:

public class Main {
    
    //Создадим простое перечисление дней недели
    private static enum DayOTheWeek{
        MON, TUE, WED, THU, FRI, SAT, SUN
    }

    public static void main(String[] args) {
        //Выбираем понедельник (MON)
        var dayOfTheWeek= DayOTheWeek.MON;

        switch (dayOfTheWeek){
            case MON:
                System.out.println("Понедельник");
                break;
            case TUE:
                System.out.println("Вторник");
                break;
            default:
                System.out.println("Другой день недели");
        }
    }
}

Вывод:

Понедельник

break при этом прерывает процесс проверки, поскольку соответствие условия уже найдено. Но начиная с Java 13, вместо break в условном операторе switch правильнее использовать yield — ключевое слово, которое не только завершает проверку, но и возвращает значение блока.

Кроме того, с 12 версии Java конструкция switch-case также претерпела некоторые изменения. Если вы используете в работе IntelliJ IDEA, данная среда разработки сама подскажет, как оптимизировать switch-case под новые версии.

Вот преобразованный код из нашего примера с некоторыми изменениями:

public class Main {
    private static enum DayOTheWeek{
        MON, TUE, WED, THU, FRI, SAT, SUN
    }

    public static void main(String[] args) {
        //В этот раз выберем вторник
        var dayOfTheWeek= DayOTheWeek.TUE;

        String result = switch (dayOfTheWeek){
            case MON -> "Понедельник";
            case TUE, WED, THU, FRI -> {
                yield "Любой будний день, кроме понедельника.";
            }
            default -> "Выходной день";
        };
        System.out.println(result);
    }
}

Вывод:

Любой будний день, кроме понедельника.

Задачи на условные операторы Java

Определите, что выведут в консоль следующие примеры, без проверки в компиляторе.

1. В переменной min лежит число от 0 до 59. Определите в какую четверть часа попадает это число (в первую, вторую, третью или четвертую):

int min = 10;
        
if(min >= 0 && min <= 14){
    System.out.println("В первую четверть.");
}
else if(min >= 15 && min <= 30){
    System.out.println("Во вторую четверть.");
}
else if(min >= 31 && min <= 45){
    System.out.println("В третью четверть.");
}
else{
    System.out.println("В четвертую четверть.");
}

2. Что выведет следующий код:

int month = 3;
String monthString;
switch (month) {
    case 1:  monthString = "Январь";
             break;
    case 2:  monthString = "Февраль";
             break;
    case 3:  monthString = "Март";
             break;
    case 4:  monthString = "Апрель";
             break;
    case 5:  monthString = "Май";
             break;
    case 6:  monthString = "Июнь";
             break;
    case 7:  monthString = "Июль";
             break;
    case 8:  monthString = "Август";
             break;
    case 9:  monthString = "Сентябрь";
             break;
    case 10: monthString = "Октябрь";
             break;
    case 11: monthString = "Ноябрь";
             break;
    case 12: monthString = "Декабрь";
             break;
    default: monthString = "Не знаем такого";
             break;
}
System.out.println(monthString);

3. Какое значение будет присвоено переменной k:

int i = -10 * -1 + (-2);
int k = i < 0 ? -i : i;
System.out.println(k);

Пишите свои ответы к задачам по условным операторам в Java.