Привет! Сегодняшняя лекция будет не очень большой, но совершенно точно полезной :) Мы поговорим о так называемом тернарном операторе. Коротко: тернарный оператор это краткая замена if-else для случая "одно условие, два результата". Синтаксис такой: условие ? результат1 : результат2. Если условие истинно (true), берется результат1, если ложно (false), результат2. Он умещает в одну строку то, что через if-else заняло бы несколько. "Тернарный" в переводе означает "тройной". Это альтернатива условному оператору if-else, который тебе уже знаком.

Кратко

  • Тернарный оператор это краткая замена if-else для случая "одно условие, два результата".
  • Синтаксис: условие ? результат1 : результат2 (если условие true, берется результат1, иначе результат2).
  • Он записывает в одну строку то, что через if-else занимает несколько строк.
  • Скобки вокруг условия не обязательны, но улучшают читаемость.
  • По производительности разницы с if-else почти нет; выбор зависит от читаемости.
  • Простое условие: можно тернарный оператор; сложное, многоступенчатое условие: лучше if-else.
Тернарный оператор в Java как краткая замена условия 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)
  • Два возможных результата ("Все в порядке, проходите!" и "Этот фильм не подходит для вашего возраста!")
Читать и строить тернарный оператор удобно по шагам:
  1. Записываем условие (например, man.getAge() >= 18).
  2. Ставим вопросительный знак ?.
  3. Пишем результат для случая, когда условие истинно (true).
  4. Ставим двоеточие :.
  5. Пишем результат для случая, когда условие ложно (false).
Вначале в коде записывается условие, после которого ставится вопросительный знак.
man.getAge() >= 18 ?
"Возраст человека больше или равно 18?" Далее следует первый результат. Он срабатывает в случае, если условие возвращает true, то есть является истинным:
String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!"
Возраст человека больше или равно 18? Если да, присвоить переменной securityAnswer значение "Все в порядке, проходите!". Далее следует оператор ":" , после которого записывается второй результат. Он срабатывает в случае, если условие возвращает false, то есть является ложным:
String securityAnswer = man.getAge() >= 18 ? "Все в порядке, проходите!" : "Этот фильм не подходит для вашего возраста!";
Возраст человека больше или равно 18? Если да, присвоить переменной securityAnswer значение "Все в порядке, проходите!". Если нет, присвоить переменной securityAnswer значение "Этот фильм не подходит для вашего возраста!" Вот так и выглядит общая логика тернарного оператора. условие ? результат 1 : результат 2 Синтаксис тернарного оператора: условие ? результат1 : результат2Кстати, скобки вокруг условия ставить не обязательно: мы сделали это для большей читаемости. Сработает и без них:
public static void main(String[] args) {

   Man man = new Man(22);

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

   System.out.println(securityAnswer);

}

Тернарный оператор или if-else: что выбрать

Что же все-таки использовать: if-else, или тернарный оператор? С точки зрения производительности особой разницы нет. Точнее, может она и есть, но незначительная. Здесь вопрос относится скорее к читаемости твоего кода. Он крайне важен в программировании: код, который ты пишешь, должен не только корректно работать, но и легко читаться. Ведь он может перейти "по наследству" к другим программистам, твоим коллегам! И если он будет тяжелым для понимания, это усложнит и их работу, и твою: именно к тебе они будут бегать за объяснениями каждые 5 минут. Общая рекомендация может звучать так: если условие простое и легко проверяется, можно без ущерба использовать тернарный оператор. Таким образом ты сократишь объем кода и количество проверок if-else, которых там и без того может быть немало. А вот если условие является сложным и многоступенчатым, лучше использовать if-else. Например, в этом случае использовать тернарный оператор будет плохой идеей:
String securityAnswer = (man.getAge() >= 18 && (man.hasTicket() || man.hasCoupon()) && !man.hasChild())  ? "Проходите!" : "Вы не можете пройти!";
Так сходу и не поймешь, что тут происходит! Код стал очень сложным для чтения. (О логических операторах && и || подробнее в статье про операции над числами.) А все из-за сложного условия:
  • Если человеку больше или равно 18 лет + у него есть билет (или у него есть купон на бесплатное посещение) + с ним нет маленьких детей, тогда он может пройти.
  • Если хотя бы одна из частей условия возвращает false, тогда не может.
Вот здесь явно лучше бы подошло использование if-else. Да, наш код стал бы побольше в размерах, но он был бы в разы более читаемым. И никто из коллег не схватится за голову, если такой код достанется ему в наследство :) Коротко разницу можно свести в таблицу:
Критерийif-elseТернарный оператор
Синтаксиснесколько строк с блоками {}одна строка: условие ? a : b
Когда использоватьсложные, многоступенчатые условияпростые условия с двумя результатами
Читаемостьлучше для сложной логикилучше для коротких проверок
Напоследок могу порекомендовать тебе книгу. Мы затронули в лекции тему читаемости кода. Ей посвящена ставшая классикой книга "Чистый код" Роберта Мартина. Синтаксис условного оператора описан и в документации Oracle (Conditional Operators). Книга Чистый код Роберта Мартина о читаемости кодаВ ней собраны лучшие практики и рекомендации для программистов, которые позволят тебе писать не только работающий, но и легко читаемый код. Обзор этой книги есть на JavaRush.

Читайте также

Вопросы и ответы

Что такое тернарный оператор в Java?

Это краткая форма условия if-else для случая, когда есть одно условие и два результата. Записывается в одну строку: условие ? результат1 : результат2.

Как работает тернарный оператор?

Сначала проверяется условие. Если оно истинно (true), берется значение после знака ?, если ложно (false), значение после двоеточия :.

Чем тернарный оператор отличается от if-else?

Он делает то же самое, но в одну строку. По производительности разницы почти нет, отличие в читаемости кода.

Когда лучше использовать тернарный оператор, а когда if-else?

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

Нужны ли скобки вокруг условия в тернарном операторе?

Не обязательно. Код сработает и без них, но скобки часто ставят для лучшей читаемости.

Можно ли вкладывать тернарные операторы друг в друга?

Технически можно, но это быстро делает код нечитаемым. Для сложной логики лучше использовать if-else.