Тернарный оператор ?: в Java
Тернарный оператор ?: — это единственный оператор в Java с тремя операндами. Он позволяет в одном выражении выбрать одно из двух значений в зависимости от условия и часто используется как краткая замена короткому if-else.
Главное отличие от if в том, что тернарный оператор — это выражение, которое возвращает значение, а if — это инструкция. Поэтому тернарный оператор удобен в инициализации переменных, при возврате значения из метода и внутри других выражений.
Синтаксис
тип результат = условие ? значениеЕслиTrue : значениеЕслиFalse;
Пример 1. Минимум двух чисел
public class Min {
public static void main(String[] args) {
int a = 12, b = 7;
int min = (a < b) ? a : b;
System.out.println("Минимум: " + min);
}
}
Вывод:
Минимум: 7
Пример 2. Чётное или нечётное
public class EvenOdd {
public static void main(String[] args) {
int n = 15;
String type = (n % 2 == 0) ? "чётное" : "нечётное";
System.out.println(n + " — " + type);
}
}
Вывод:
15 — нечётное
Пример 3. Статус датчика
public class SensorStatus {
public static void main(String[] args) {
int distance = 18; // см с УЗ-датчика
String status = (distance < 20) ? "ПРЕПЯТСТВИЕ" : "свободно";
System.out.println("Состояние: " + status);
}
}
Вывод:
Состояние: ПРЕПЯТСТВИЕ
Пример 4. Абсолютное значение
public class Abs {
public static void main(String[] args) {
int x = -42;
int abs = (x < 0) ? -x : x;
System.out.println("|" + x + "| = " + abs);
}
}
Вывод:
|-42| = 42
Пример 5. Вложенный тернарный оператор (классификация)
public class Grade {
public static void main(String[] args) {
int score = 78;
String grade = (score >= 90) ? "A"
: (score >= 75) ? "B"
: (score >= 60) ? "C"
: "F";
System.out.println("Балл " + score + " -> " + grade);
}
}
Вывод:
Балл 78 -> B
Пример 6. Возврат значения из метода
public class MotorSpeed {
static int clamp(int value) {
return (value > 255) ? 255 : (value < 0 ? 0 : value);
}
public static void main(String[] args) {
System.out.println(clamp(300));
System.out.println(clamp(-20));
System.out.println(clamp(128));
}
}
Вывод:
255
0
128
Подводные камни
Читаемость. Глубоко вложенные тернарные операторы быстро становятся нечитаемыми — обычно лучше переписать как
if-else.Типы веток. Обе ветки должны быть совместимы по типу: например,
cond ? 1 : 2.0вернётdouble, аcond ? "a" : 1—Object(по общему предку).Это выражение, не инструкция. Тернарный оператор обязан что-то вернуть; нельзя использовать его «ради побочного эффекта» как
if.Скобки. Условие сложнее, чем сравнение, обязательно оборачивайте в скобки — приоритеты
?:ниже арифметических, но привычка спасает от ошибок.
См. также
Примечание
Лицензия и источники
Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.