Перейти к основному содержимому

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

· 3 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

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

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

2. Синтаксис

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

booleanExpression ? expression1 : expression2

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

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

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

int num = 8;
String msg = "";
if(num > 10) {
msg = "Number is greater than 10";
}
else {
msg = "Number is less than or equal to 10";
}

Здесь мы присвоили значение msg на основе условной оценки num .

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

final String msg = num > 10 
? "Number is greater than 10"
: "Number is less than or equal to 10";

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

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

Мы можем проверить это, написав простой тестовый пример 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.

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

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

Итак, эта конструкция действительна в Java:

String msg = num > 10 ? "Number is greater than 10" : 
num > 5 ? "Number is greater than 5" : "Number is less than equal to 5";

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

String msg = num > 10 ? "Number is greater than 10" 
: (num > 5 ? "Number is greater than 5" : "Number is less than equal to 5");

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

6. Заключение

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

Как обычно, весь исходный код доступен на GitHub .