JavaRush /Java блог /Java Developer /Тернарный оператор в Java
Автор
Василий Малик
Senior Java-разработчик в CodeGym

Тернарный оператор в Java

Статья из группы Java Developer
Привет! Сегодняшняя лекция будет не очень большой, но совершенно точно полезной :) Мы поговорим о так называемом тернарном операторе. Тернарный оператор  - 1“Тернарный” в переводе означает “тройной”. Это альтернатива условному оператору if-else, который тебе уже знаком. Приведем пример. Допустим, какой-то человек решил пойти в кино на фильм с рейтингом 18+. Охранник проверяет его возраст на входе: если он проходит по возрасту — позволяет пройти в зал, если нет — отправляет домой. Создадим класс Man и проверим это с помощью if-else:

public class Man {

   private int age;

   public Man(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public static void main(String[] args) {

       Man man = new Man(22);

       String securityAnswer;

       if (man.getAge() >= 18) {
           securityAnswer = "Все в порядке, проходите!";
       } else {
           securityAnswer = "Этот фильм не подходит для вашего возраста!";
       }

       System.out.println(securityAnswer);

   }
}
Вывод в консоль:

"Все в порядке, проходите!"
Если убрать вывод в консоль, наша проверка выглядит следующим образом:

if (man.getAge() >= 18) {
           securityAnswer = "Все в порядке, проходите!";
       } else {
           securityAnswer = "Этот фильм не подходит для вашего возраста!";
       }
Здесь, по сути, работает простая логика: проверяется одно условие (возраст >= 18). В зависимости от этого в переменную securityAnswer присваивается одна из двух строк с ответом охранника. Такие ситуации, “одно условие — два возможных результата”, встречаются в программировании очень часто. Поэтому для них создали тот самый тернарный оператор. С его помощью мы можем упростить нашу проверку до одной строки кода:

public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = (man.getAge() >= 18) ? "Все в порядке, проходите!" : "Этот фильм не подходит для вашего возраста!";

   System.out.println(securityAnswer);

}
Так и выглядит работа этого оператора. Тернарным (тройным) его называют потому, что в его работе принимают участие 3 компонента:
  • Одно условие (man.getAge() >= 18)
  • Два возможных результата ("Все в порядке, проходите!" и "Этот фильм не подходит для вашего возраста!")
Вначале в коде записывается условие, после которого ставится вопросительный знак.

man.getAge() >= 18 ?
“Возраст человека больше или равно 18?” Далее следует первый результат. Он срабатывает в случае, если условие возвращает true, то есть является истинным:

String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!"
Возраст человека больше или равно 18? Если да — присвоить переменной securityAnswer значение "Все в порядке, проходите!". Далее следует оператор “:” , после которого записывается второй результат. Он срабатывает в случае, если условие возвращает false, то есть является ложным:

String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!" : "Этот фильм не подходит для вашего возраста!";
Возраст человека больше или равно 18? Если да — присвоить переменной securityAnswer значение "Все в порядке, проходите!". Если нет — присвоить переменной securityAnswer значение "Этот фильм не подходит для вашего возраста!" Вот так и выглядит общая логика тернарного оператора. условие ? результат 1 : результат 2 Тернарный оператор  - 2Кстати, скобки вокруг условия ставить не обязательно: мы сделали это для большей читаемости. Сработает и без них:

public static void main(String[] args) {

   Man man = new Man(22);

   String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!" : "Этот фильм не подходит для вашего возраста!";

   System.out.println(securityAnswer);

}
Что же все-таки использовать: if-else, или тернарный оператор? С точки зрения производительности особой разницы нет. Точнее, может она и есть, но незначительная. Здесь вопрос относится скорее к читаемости твоего кода. Он крайне важен в программировании: код, который ты пишешь, должен не только корректно работать, но и легко читаться. Ведь он может перейти “по наследству” к другим программистам, твоим коллегам! И если он будет тяжелым для понимания, это усложнит и их работу, и твою — именно к тебе они будут бегать за объяснениями каждые 5 минут. Общая рекомендация может звучать так: если условие простое и легко проверяется, можно без ущерба использовать тернарный оператор. Таким образом ты сократишь объем кода и количество проверок if-else, которых там и без того может быть немало. А вот если условие является сложным и многоступенчатым — лучше использовать if-else. Например, в этом случае использовать тернарный оператор будет плохой идеей:

String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild())  ? "Проходите!" : "Вы не можете пройти!";
Так сходу и не поймешь, что тут происходит! Код стал очень сложным для чтения. А все из-за сложного условия:
  • Если человеку больше или равно 18 лет + у него есть билет (или у него есть купон на бесплатное посещение) + с ним нет маленьких детей - тогда он может пройти.
  • Если хотя бы одна из частей условия возвращает false — тогда не может.
Вот здесь явно лучше бы подошло использование if-else. Да, наш код стал бы побольше в размерах, но он был бы в разы более читаемым. И никто из коллег не схватится за голову, если такой код достанется ему в наследство :) Напоследок могу порекомендовать тебе книгу. Мы затронули в лекции тему читаемости кода. Ей посвящена ставшая классикой книга “Чистый код” Роберта Мартина. Тернарный оператор  - 3В ней собраны лучшие практики и рекомендации для программистов, которые позволят тебе писать не только работающий, но и легко читаемый код. Обзор этой книги есть на JavaRush.
Комментарии (143)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
B ATAKE Уровень 15
10 февраля 2024
Почему-то дополнительные материалы не соответствуют уровню подготовленности учеников на курсе. Зачем давать людям, которые даже до циклов не добрались, создание классов, полей, методов. Того, чего они не понимают, но должны читать этот код... Только нагружаете новичков нечитаемой для них инфой.
23 января 2024
👍
Anonymous #3352746 Уровень 16
11 декабря 2023
Почему трернарник называют оператором? Ведь оператор не возвращает значение, он делает что-то. Оператор - это -, +, == и т.п. Выражение - некоторое действие: sout, c = a + b; и т.п. If - оператор, он делает выражение в зависимости от true/false. switch без ";" после последней скобки - оператор, он как if выполняет выражение, в случае попадания. switch с ";" после } - выражение, его можно присвоить переменной. Тернарник a > b ? <значение> : <значение> - возвращает значение, он не может выполнить выражение, например sout. Его значение можно присвоить переменной. В конце терна ставится ";", как у выражения. ТАК ПОЧЕМУ ЭТО ОПЕРАТОР? )) Получается правильно говорить тернарное выражение.
Ирина Уровень 10
24 октября 2023
Спасибо за лекцию! Доступный язык и интересно!
Denis Gritsay Уровень 35
13 августа 2023
шикарная лекция, спасибо!!!!
Aleksei Уровень 10
4 апреля 2023
Для чего эта дополнительная лекция??? Этот материал был подробно разжеван в основных лекциях)
Kaz Уровень 16
30 марта 2023
Кто на 3-ем уровне и не врубает, как я, почему в этих доп.лекциях используют какие-то самодельные man/car, вместо Scanner/String... ставим лайки
AleksandrB. Уровень 6
20 марта 2023
Круто 👍
Anatoly Уровень 30
19 марта 2023
^-^
Ислам Уровень 33
11 марта 2023
очень интересная лекция.