Перейти к содержанию

Тернарный оператор в Java

Тернарный условный оператор ?: позволяет определять выражения в Java. Это сокращенная форма оператора if-else, которая также возвращает значение.

В этой статье узнаем, когда и как использовать тернарную конструкцию. Начнем с рассмотрения ее синтаксиса, а затем рассмотрим ее использование.

Синтаксис

Тернарный оператор ?: в Java – единственный оператор, который принимает три операнда:

booleanExpression ? expression1 : expression2

Самый первый операнд должен быть логическим выражением, а второй и третий операнды могут быть любыми выражениями, возвращающими некоторое значение. Тернарная конструкция возвращает expression1 в качестве выходных данных, если первый операнд имеет значение true, в противном случае expression2.

Пример тернарного оператора

Рассмотрим конструкцию if-else:

int num = 8;
String msg = "";
if(num > 10) {
    msg = "Число больше 10";
}
else {
    msg = "Число меньше или равно 10";
}

Здесь присвоили значение msg на основе значения num. Можно сделать этот код более читабельным и безопасным, легко заменив оператор if-else тройной конструкцией:

final String msg = num > 10 
  ? "Число больше 10" 
  : "Число меньше или равно 10";

Оценка выражения

При использовании тернарной конструкции Java во время выполнения вычисляется только одно из правых выражений, то есть либо expression1, либо expression2.

Можно проверить это, написав простой тестовый пример JUnit:

@Test
public void whenConditionIsTrue_thenOnlyFirstExpressionIsEvaluated() {
    int exp1 = 0, exp2 = 0;
    int result = 12 > 10 ? ++exp1 : ++exp2;
    
    assertThat(exp1).isEqualTo(1);
    assertThat(exp2).isEqualTo(0);
    assertThat(result).isEqualTo(1);
}

Логическое выражение 12 > 10 всегда оценивается как true, поэтому значение exp2 осталось прежним.

Аналогично рассмотрим, что происходит при ложном условии:

@Test
public void whenConditionIsFalse_thenOnlySecondExpressionIsEvaluated() {
    int exp1 = 0, exp2 = 0;
    int result = 8 > 10 ? ++exp1 : ++exp2;

    assertThat(exp1).isEqualTo(0);
    assertThat(exp2).isEqualTo(1);
    assertThat(result).isEqualTo(1);
}

Значение exp1 осталось нетронутым, а значение exp2 увеличилось на 1.

Вложенный тернарный оператор

Можно вложить тернарный оператор в любое количество уровней:

String msg = num > 10 ? "Число больше 10" : 
  num > 5 ? "Число больше 5" : "Число меньше или равно 5";

Чтобы улучшить читаемость приведенного выше кода, можно использовать фигурные скобки () везде, где это необходимо:

String msg = num > 10 ? "Число больше 10" 
  : (num > 5 ? "Число больше 5" : "Число меньше или равно 5");

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

Заключение

В этой статье рассмотрели тернарный оператор в Java. Невозможно заменить каждую конструкцию if-else тернарным оператором. Но в некоторых случаях это отличный инструмент, который делает код намного короче и читабельнее.

Исходный код доступен на GitHub.

Оригинал