Привет! Сегодняшняя лекция будет не очень большой, но совершенно точно полезной :) Мы поговорим о так называемом
тернарном операторе.
Коротко: тернарный оператор это краткая замена
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)
- Два возможных результата ("Все в порядке, проходите!" и "Этот фильм не подходит для вашего возраста!")
Читать и строить тернарный оператор удобно по шагам:
- Записываем условие (например,
man.getAge() >= 18).
- Ставим вопросительный знак
?.
- Пишем результат для случая, когда условие истинно (
true).
- Ставим двоеточие
:.
- Пишем результат для случая, когда условие ложно (
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.