Тернарный условный оператор ?: позволяет определять выражения в 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.