Знаменитая ошибка NullPointerException — бич многих Java-программ. Класс Optional, появившийся в Java 8, призван решать эту проблему. Это контейнер, который может содержать значение или быть пустым.
Вместо проверки if (x != null), мы используем методы ifPresent(), orElse() или map(). Это делает код безопаснее и выразительнее. Использование Optional — это хороший тон в современной разработке на Java. В этом блоке заданий вы научитесь создавать опциональные значения и безопасно извлекать из них данные.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Безопасное создание
В этом задании вам нужно исправить код, который может выбросить исключение 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); // здесь можно использовать обычный метод2. Альтернативное значение
В данном задании вам предстоит работать с классом Optional из Java 8+. Optional — это контейнер, который может содержать или не содержать значение. Он помогает избежать проверок на null и явно указывает на возможное отсутствие значения. В коде ниже создаётся пустой Optional
Optional<String> optional = Optional.empty();
String result = optional.input1S;3. Создание Optional
Перед вами список выражений, представляющих различные способы создания объектов Optional в Java. Разнесите их по категориям в соответствии с тем, какой метод создания они используют: 'Точно не null' (метод of), 'Может быть null' (метод ofNullable) или 'Пустой' (метод empty). Каждый элемент должен оказаться в одной из категорий. Обратите внимание, что метод of требует ненулевого аргумента, ofNullable принимает аргумент, который может быть null, а empty создает пустой Optional.
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()
В данном фрагменте кода на 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 }}5. Цепочка map и filter
Проанализируйте цепочку методов map и filter, применённых к объекту 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. Проверка наличия
Внимательно изучите приведённый фрагмент кода на 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
Из предложенных строк соберите корректную 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()); }}8. Результат orElse
В данном задании вам предстоит проанализировать код, использующий класс 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);
}
}