Тернарный оператор ?: в 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" : 1Object (по общему предку).

  • Это выражение, не инструкция. Тернарный оператор обязан что-то вернуть; нельзя использовать его «ради побочного эффекта» как if.

  • Скобки. Условие сложнее, чем сравнение, обязательно оборачивайте в скобки — приоритеты ?: ниже арифметических, но привычка спасает от ошибок.

См. также

Примечание

Лицензия и источники

Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.