Бесплатный курс по java. Зарегистрируйтесь для отслеживания прогресса →

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

Вкратце

<predicate> ? <expression on true> : <expression on false>

// например
number >= 0 ? number : -number

Посмотрите на определение метода, который возвращает модуль переданного числа:


public static int abs(int number) {
    if (number >= 0) {
        return number;
    }

    return -number;
}

Можно ли записать его лаконичнее? Что-то вроде return ОТВЕТ В ЗАВИСИМОСТИ ОТ УСЛОВИЯ? Для этого справа от return должно быть выражение, но if — это инструкция, а не выражение.

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

Тернарный оператор — единственный в своем роде оператор, требующий три операнда:


public static int abs(int number) {
    return number >= 0 ? number : -number;
}

Общий паттерн выглядит так: <predicate> ? <expression on true> : <expression on false>.

Давайте перепишем начальный вариант getTypeOfSentence() аналогично:

Было:

public static void main(String[] args) {
  getTypeOfSentence("Hodor"); // => normal
  getTypeOfSentence("Hodor?"); // => question
}

static String getTypeOfSentence(String sentence) {
    var lastChar = sentence.charAt(sentence.length() - 1);
    if (lastChar == '?') {
        return "question";
    }

    return "normal";
}

Стало:

public static void main(String[] args) {
  getTypeOfSentence("Hodor"); // => normal
  getTypeOfSentence("Hodor?"); // => question
}

static String getTypeOfSentence(String sentence) {
    var lastChar = sentence.charAt(sentence.length() - 1);
    return (lastChar == '?') ? "question" : "normal";
}

Если вы помните, в чём сила выражений, то вероятно уже догадались, что тернарный оператор можно вкладывать в тернарный оператор. Не делайте этого :) Такой код тяжело и читать и отлаживать, это очень плохая практика.

Задание

Реализуйте метод convertString(), который принимает на вход строку и, если первая буква не заглавная, возвращает строку повторенную из исходной строки 2 раза. Если первая буква заглавная, то строка возвращается без изменений.

Примеры вызова:

convertString("Hello"); // => 'Hello'
convertString("hello"); // => 'hellohello'

Повторить строчку можно используя метод строки repeat(). Получить символ из строки по индексу можно при помощи метода строки charAt(). Чтобы выяснить является ли буква заглавной, можно использовать метод Character.isUpperCase(Char char). Этот метод вернет true, если строка начинается с заглавной буквы, и false в противном случае.

Попробуйте написать два варианта метода: с обычным if-else, и с тернарным оператором.


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе