Привет! Сегодняшняя лекция будет не очень большой, но совершенно точно полезной :) Мы поговорим о так называемом тернарном операторе.
“Тернарный” в переводе означает “тройной”. Это альтернатива условному оператору
Кстати, скобки вокруг условия ставить не обязательно: мы сделали это для большей читаемости. Сработает и без них:
В ней собраны лучшие практики и рекомендации для программистов, которые позволят тебе писать не только работающий, но и легко читаемый код.
Обзор этой книги есть на JavaRush.

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

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
. Да, наш код стал бы побольше в размерах, но он был бы в разы более читаемым. И никто из коллег не схватится за голову, если такой код достанется ему в наследство :)
Напоследок могу порекомендовать тебе книгу. Мы затронули в лекции тему читаемости кода. Ей посвящена ставшая классикой книга “Чистый код” Роберта Мартина.

ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ