Java 8 (дополнительно)

При написании программ на java мы часто имеем дело со сценариями, в которых мы получаем нулевую ссылку на объекты. Такие сценарии являются проблемой для разработчиков, поскольку разыменование таких переменных вызывает, как вы уже догадались, исключения нулевого указателя. Стандартной практикой для разработчиков до Java 8 была проверка на ноль каждый раз, когда вы сталкивались с такими неоднозначными экземплярами объектов.

String username= userRepository.getUsername(id);
    if (username!= null) {
        log.debug("Username: {} " , username);
        authenticate(username);
    }

В Java 8 добавлен API, чтобы избежать таких сценариев, когда разработчики разыменовывают нулевую ссылку и попадают в беду. Благодаря использованию необязательного API Java свела к минимуму проблему нулевых указателей.

Все основные интерфейсы дополнительного API JAVA 8 следующие:

Также существует конкретная реализация опционального интерфейса. Например, OptionalInt — это реализация Optional, которая обрабатывает только значения Integer. OptionalLong,OptionalDouble,OptionalBoolean — другие подобные реализации. Конкретные реализации необязательного имеют на несколько интерфейсов меньше, чем исходная реализация необязательного.

Как использовать отдельные интерфейсы? Вот несколько очень простых примеров использования интерфейсов в option. Посмотрите на определение в таблице, когда вы смотрите на пример фрагмента для дальнейшего разъяснения.

  1. of() и ofNullable() isPresent()
String str
Optional<String> strOpt = Optional.of(str);
Optional<String> emptyOpt = Optional.ofNullable(null);
//interface provides way to check if a value is present or not
if(strOpt.isPresent()){
    //opt.get() gives the values inside
    //calling the get() in which value isn't present often results
    //in null reference
    System.out.printf("Value inside optional: %s \n" , strOpt.get() );
}
if(emptyOpt.isPresent()) {
    System.out.println("This line won't be called");
} else {
    System.out.println("Because there was nothing present " +
            "in empty optional this line is called");
}

2. илииначе()

System.out.printf("Printing default value for : %s " ,emptyOpt.orElse("Default value"));

3. фильтр()

Optional<String> val = strOpt.filter(s -> {
   return s.equalsIgnoreCase("Singapore") ;
});

Функциональный интерфейс будет фильтровать элемент, если значение строкового элемента внутри option равно singapore.

4. карта ()

public class StringWrapper {
    String val;

    public StringWrapper(String val) {
        this.val = val;
    }

    public String getVal() {
        return val;
    }

    public void setVal(String val) {
        this.val = val;
    }
}
Optional<StringWrapper> stringWrapperOptional= strOpt.map(s -> new StringWrapper(s));

Преобразует String в StringWrapper и создает новый необязательный элемент.

5. иначевыбросить()

Supplier mySupplier = () -> new Exception("No Element Found ");
Optional<String> emptyOpt = null; 
Optional.ofNullable(null);
emptyOpt.orElseThrow(mySupplier);

6. Если присутствует ()

//if present then use a Double Consumer interface
//do something with the value - dbOperation maybe
OptionalDouble optionalDouble = OptionalDouble.of(repostiory.stanId());
optionalDouble.ifPresent(value -> {
    System.out.printf("Printing value if present: %f \n" , value);
});

Вызывает интерфейс потребителя для выполнения system.out, если значение присутствует в optionDouble.

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