Класс Optional (избегаем null)

Тренажер по Java для пользователей с начальным уровнем подготовки.

Тренажер по Java

Знаменитая ошибка NullPointerException — бич многих Java-программ. Класс Optional, появившийся в Java 8, призван решать эту проблему. Это контейнер, который может содержать значение или быть пустым.

Вместо проверки if (x != null), мы используем методы ifPresent(), orElse() или map(). Это делает код безопаснее и выразительнее. Использование Optional — это хороший тон в современной разработке на Java. В этом блоке заданий вы научитесь создавать опциональные значения и безопасно извлекать из них данные.

Список тем

1. Безопасное создание

id: 40521_opt_01_replace

В этом задании вам нужно исправить код, который может выбросить исключение NullPointerException при создании объекта Optional. Исходный код использует метод Optional.of для переменной, которая может содержать null. Замените вызовы методов так, чтобы код работал безопасно: для переменных, которые могут быть null, используйте Optional.ofNullable, а для гарантированно ненулевых — Optional.of. В результате программа должна корректно создавать Optional-объекты без риска исключений.

Заполните пропуски
String name = getName(); // может вернуть null
String language = "Java"; // гарантированно не null

Optional<String> optName = Optional.input1S(name); // здесь нужен безопасный метод
Optional<String> optLang = Optional.input2S(language); // здесь можно использовать обычный метод
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

2. Альтернативное значение

id: 40521_opt_02_select

В данном задании вам предстоит работать с классом Optional из Java 8+. Optional — это контейнер, который может содержать или не содержать значение. Он помогает избежать проверок на null и явно указывает на возможное отсутствие значения. В коде ниже создаётся пустой Optional. Ваша задача — выбрать подходящий метод (orElse или orElseGet) для получения значения из Optional, задав дефолтное значение на случай, если контейнер пуст. Обратите внимание на синтаксис вызова методов и типы принимаемых аргументов.

Нужно правильно расставить в пропуски предложенные варианты
Optional<String> optional = Optional.empty();
String result = optional.input1S;
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Создание Optional

id: 40521_opt_03_sort

Перед вами список выражений, представляющих различные способы создания объектов Optional в Java. Разнесите их по категориям в соответствии с тем, какой метод создания они используют: 'Точно не null' (метод of), 'Может быть null' (метод ofNullable) или 'Пустой' (метод empty). Каждый элемент должен оказаться в одной из категорий. Обратите внимание, что метод of требует ненулевого аргумента, ofNullable принимает аргумент, который может быть null, а empty создает пустой Optional.

Перетяните элементы в соответствующие блоки
Точно не null (of)
Может быть null (ofNullable)
Пустой (empty)
Optional.of("Hello")
Optional.ofNullable(user.getName())
Optional.empty()
Optional.of(42)
Optional.ofNullable(null)
Optional.of(new ArrayList<>())
Optional.ofNullable(someObject)
Optional.ofNullable(possibleNullValue)
Сообщения
Проверить
Показать подсказку

4. Опасный get()

id: 40521_opt_04_error

В данном фрагменте кода на Java используется класс Optional, но присутствует опасный вызов метода get() без предварительной проверки наличия значения. Это может привести к исключению NoSuchElementException, если Optional пуст. Найдите строку с ошибкой и исправьте её, заменив на безопасный метод обработки отсутствующего значения, например, orElseThrow.

Найдите ошибку и исправьте
import java.util.Optional;
 
public class Main {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.ofNullable(getString());
        String value = optionalValue.get(); // Опасный вызов get() без проверки
        System.out.println(value);
    }
 
    private static String getString() {
        return null; // Может вернуть null
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

5. Цепочка map и filter

id: 40521_opt_05_predict

Проанализируйте цепочку методов map и filter, применённых к объекту Optional. Определите, какое значение будет содержаться в результате выполнения кода: будет ли возвращено непустое значение или пустой Optional. Обратите внимание на порядок операций и условия фильтрации.

Выберите правильный вариант ответа
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> opt = Optional.of("java");
        Optional<String> result = opt
            .map(s -> s.concat("8"))
            .filter(s -> s.length() > 5)
            .map(String::toUpperCase);
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

6. Проверка наличия

id: 40521_opt_06_click

Внимательно изучите приведённый фрагмент кода на Java, использующий класс Optional. Ваша задача — найти и отметить (кликнуть) все вызовы метода, который возвращает значение true, если внутри объекта Optional присутствует не-null значение. Отмечайте только те методы, которые непосредственно выполняют эту проверку. Не отмечайте другие методы, даже если они также возвращают boolean, но имеют иное назначение, а также не отмечайте имена переменных, операторы или другие элементы синтаксиса.

Кликните по всем фрагментам, которые подходят под условие задания.
import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> presentOpt = Optional.of("Hello");
        Optional<String> emptyOpt = Optional.empty();
        
        // Проверка наличия значения
        if (presentOpt.{{isPresent()~|~t1}}) {
            System.out.println("Значение присутствует: " + presentOpt.get());
        }
        
        // Альтернативная проверка (с Java 11)
        if (emptyOpt.{{isEmpty()~|~t2}}) {
            System.out.println("Значение отсутствует");
        }
        
        // Использование метода, возвращающего boolean, но не для проверки наличия
        boolean isEqual = presentOpt.{{equals(emptyOpt)~|~t3}};
        
        // Ещё одна проверка наличия в потоке обработки
        presentOpt.{{isPresent()~|~t4}}
            .ifPresent(val -> System.out.println("Обработка: " + val));
            
        // Проверка через map и isPresent
        Optional<Integer> lengthOpt = presentOpt.map(String::length);
        if (lengthOpt.{{isPresent()~|~t5}}) {
            System.out.println("Длина: " + lengthOpt.get());
        }
    }
}
Сообщения
Проверить
Показать подсказку

7. Optional и Stream

id: 40521_opt_07_build

Из предложенных строк соберите корректную java-программу, которая создаёт стрим из нескольких строк, находит первый элемент с помощью findFirst (получая Optional) и выводит его, если он присутствует, используя ifPresent. Лишние строки в решение включать не нужно.

Перетяните в правильном порядке строки из одного блока в другой
import java.util.Optional;
import java.util.stream.Stream;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Optional<String> first = Stream.of("apple", "banana", "cherry").findFirst();
        first.ifPresent(System.out::println);
        System.out.println(first.get());
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

8. Результат orElse

id: 40521_opt_08_give

В данном задании вам предстоит проанализировать код, использующий класс Optional из Java 8+. Обратите внимание на создание пустого Optional и применение метода orElse(). Ваша задача — определить, какая строка будет выведена на экран в результате выполнения программы. Введите только эту строку без кавычек и дополнительных символов.

Что должно получиться?
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional<String> optional = Optional.empty();
        String result = optional.orElse("Default");
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру