Java optional not null

Новый класс Optional в Java 8, не панацея от NullPointerException

В релизе Java 8 появился новый класс Optional призванный помочь разработчикам в обработке NullPointerException .

С NullPointerException встречались многие и во многих случаях, это очень неприятное исключение заставляет дебажить код, дабы понять, в каком месте, кто-то из твоих предшественников(а возможно и ты), не поставили пресловутую проверку на null .

А что если вообще запретить назначать тем или иным полям класса значения равные null ? Java естественно не запрещает нам делать этого, но с Optional это становится немного удобнее и нагляднее.

Итак, приступим к описанию основных возможностей этого нововведения.

Создание объектов Optional

Для начала приведу пример класса с использованием Optional :

import java.util.Date; import java.util.Optional; public class Person < private OptionalfirstName; private Optional secondName; private Optional age; private Optional address; public Optional getFirstName() < return firstName; >public void setFirstName(String firstName) < this.firstName = Optional.ofNullable(firstName); >public Optional getSecondName() < return secondName; >public void setSecondName(String secondName) < this.secondName = Optional.of(secondName); >public Optional getAge() < return age; >public void setAge(Integer age) < this.age = Optional.ofNullable(age); >public Optional getAddress() < return address; >public void setAddress(PersonAddress address) < this.address = Optional.of(address); >> 

Как видите при установке полям класса значений, через «set» методы, мы используем статические методы класса Optional — of(), ofNullable()) .

Читайте также:  Unzip zip file in java

Эти методы используются для создания объектов типа Optional , ниже приведены примеры такого создания объектов:

/** Создание Optional объектов */ //Пустой Optional объект Optional optionalPerson = Optional.empty(); //Optional объект с ненулевым значением Optional optionalNonNull = Optional.of(somePerson); //Optional объект с возможностью нулевого значения Optional optionalNullable = Optional.ofNullable(somePerson); 
Использование Optional для устранения избыточного кода

Часто проверка на null объектов, которые передаются или обрабатываются в различных методах, занимает множество строчек кода, если необходимо работать не только с переданным объектом, а с полем объекта, которое в свою очередь содержит еще одно поле, к примеру текстового описания.

При попытке обратиться напрямую к этому полю через цепочку объектов и при условии, что переданный объект по каким-то причинам пришел равный null мы получим NullPointerException , поэтому для начала нам необходимо проверить каждый объект на null и уже потом взять необходимое нам текстовое поле:

Person person = getDefaultPerson(); if (person != null) < PersonAddress personAddress = person.getAddress(); if (personAddress != null) < PersonAddressStreet street = personAddress.getStreet(); if(street != null) < streetName = street.getStreetName(); >else < streetName = "EMPTY"; >> > 

А теперь все то же самое, но с использованием Optional :

String streetName = person.flatMap(Person::getAddress) .flatMap(PersonAddress::getStreet) .map(PersonAddressStreet::getStreetName) .orElse("EMPTY"); 

Намного лаконичнее, не правда ли?

Действия с объектом, с использованием метода ifPresent()

Метод ifPresent() позволяет также устранить некоторую избыточность кода, следующего вида:

Те же действия, но с использованием Optional :

person.ifPresent(System.out::println); 
Действия с объектом с использованием isPresent()

isPresent() не дает нам большой выгоды по устранению избыточности кода, но зато придает немного большую информативность написанному коду.

То же самое, но с использованием Optional :

Действия с объектом с использованием orElse(), orElseThrow()

И напоследок еще несколько методов для наведения «красоты» в коде.

Person personNew = person != null ? person : new Person(); 

То же самое, но с использованием Optional :

Person personNew = person.orElse(new Person()); 

Или, если не хотим создавать объект, можно выбросить исключение:

Person personNewThrow = person.orElseThrow(Exception::new); 
Заключение

Естественно Optional не дает никакой гарантии избавления от NullPointerException и все проверки на null можно было описывать и раньше, но с Optional это действия становятся быстрее и проще, так как дополнительные методы для проверки объекта или проверки и каких-то дальнейших действий с объектом уже описаны и нам осталось только воспользоваться ими в своем коде.

А также несомненно, Optional помогает придать большую информативность коду, повысить его читабельность.

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

Информация для дальнейшего изучения:

Источник

Java optional not null

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (return a default value if value not present) and ifPresent() (execute a block of code if the value is present). This is a value-based class; use of identity-sensitive operations (including reference equality ( == ), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.

Method Summary

If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional .

If a value is present, apply the provided Optional -bearing mapping function to it, return that result, otherwise return an empty Optional .

If a value is present in this Optional , returns the value, otherwise throws NoSuchElementException .

If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result.

Returns an Optional describing the specified value, if non-null, otherwise returns an empty Optional .

Return the contained value, if present, otherwise throw an exception to be created by the provided supplier.

Methods inherited from class java.lang.Object

Method Detail

empty

of

ofNullable

Returns an Optional describing the specified value, if non-null, otherwise returns an empty Optional .

get

If a value is present in this Optional , returns the value, otherwise throws NoSuchElementException .

isPresent

ifPresent

filter

public OptionalT> filter(PredicateT> predicate)

If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional .

map

public Optional map(FunctionT,? extends U> mapper)

If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional .

API Note: This method supports post-processing on optional values, without the need to explicitly check for a return status. For example, the following code traverses a stream of file names, selects one that has not yet been processed, and then opens that file, returning an Optional :

 Optional fis = names.stream().filter(name -> !isProcessedYet(name)) .findFirst() .map(name -> new FileInputStream(name)); 

flatMap

public Optional flatMap(FunctionT,Optional> mapper)

If a value is present, apply the provided Optional -bearing mapping function to it, return that result, otherwise return an empty Optional . This method is similar to map(Function) , but the provided mapper is one whose result is already an Optional , and if invoked, flatMap does not wrap it with an additional Optional .

orElse

orElseGet

orElseThrow

public Throwable> T orElseThrow(Supplier exceptionSupplier) throws X extends Throwable

Return the contained value, if present, otherwise throw an exception to be created by the provided supplier.

equals

  • it is also an Optional and;
  • both instances have no value present or;
  • the present values are «equal to» each other via equals() .

hashCode

toString

Returns a non-empty string representation of this Optional suitable for debugging. The exact presentation format is unspecified and may vary between implementations and versions.

Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2023, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.

Источник

Class Optional

A container object which may or may not contain a non- null value. If a value is present, isPresent() returns true . If no value is present, the object is considered empty and isPresent() returns false .

Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (returns a default value if no value is present) and ifPresent() (performs an action if a value is present).

This is a value-based class; programmers should treat instances that are equal as interchangeable and should not use instances for synchronization, or unpredictable behavior may occur. For example, in a future release, synchronization may fail.

Method Summary

If a value is present, and the value matches the given predicate, returns an Optional describing the value, otherwise returns an empty Optional .

If a value is present, returns the result of applying the given Optional -bearing mapping function to the value, otherwise returns an empty Optional .

If a value is present, performs the given action with the value, otherwise performs the given empty-based action.

If a value is present, returns an Optional describing (as if by ofNullable(T) ) the result of applying the given mapping function to the value, otherwise returns an empty Optional .

If a value is present, returns an Optional describing the value, otherwise returns an Optional produced by the supplying function.

If a value is present, returns the value, otherwise returns the result produced by the supplying function.

If a value is present, returns the value, otherwise throws an exception produced by the exception supplying function.

If a value is present, returns a sequential Stream containing only that value, otherwise returns an empty Stream .

Methods declared in class java.lang.Object

Method Details

empty

of

ofNullable

get

isPresent

isEmpty

ifPresent

ifPresentOrElse

If a value is present, performs the given action with the value, otherwise performs the given empty-based action.

filter

If a value is present, and the value matches the given predicate, returns an Optional describing the value, otherwise returns an empty Optional .

map

If a value is present, returns an Optional describing (as if by ofNullable(T) ) the result of applying the given mapping function to the value, otherwise returns an empty Optional . If the mapping function returns a null result then this method returns an empty Optional .

API Note: This method supports post-processing on Optional values, without the need to explicitly check for a return status. For example, the following code traverses a stream of URIs, selects one that has not yet been processed, and creates a path from that URI, returning an Optional :

 Optional p = uris.stream().filter(uri -> !isProcessedYet(uri)) .findFirst() .map(Paths::get); 

flatMap

If a value is present, returns the result of applying the given Optional -bearing mapping function to the value, otherwise returns an empty Optional . This method is similar to map(Function) , but the mapping function is one whose result is already an Optional , and if invoked, flatMap does not wrap it within an additional Optional .

or

If a value is present, returns an Optional describing the value, otherwise returns an Optional produced by the supplying function.

stream

If a value is present, returns a sequential Stream containing only that value, otherwise returns an empty Stream .

API Note: This method can be used to transform a Stream of optional elements to a Stream of present value elements:

 Stream> os = .. Stream s = os.flatMap(Optional::stream) 

orElse

orElseGet

If a value is present, returns the value, otherwise returns the result produced by the supplying function.

orElseThrow

orElseThrow

If a value is present, returns the value, otherwise throws an exception produced by the exception supplying function.

equals

  • it is also an Optional and;
  • both instances have no value present or;
  • the present values are «equal to» each other via equals() .

hashCode

toString

Returns a non-empty string representation of this Optional suitable for debugging. The exact presentation format is unspecified and may vary between implementations and versions.

Report a bug or suggest an enhancement
For further API reference and developer documentation see the Java SE Documentation, which contains more detailed, developer-targeted descriptions with conceptual overviews, definitions of terms, workarounds, and working code examples. Other versions.
Java is a trademark or registered trademark of Oracle and/or its affiliates in the US and other countries.
Copyright © 1993, 2023, Oracle and/or its affiliates, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
All rights reserved. Use is subject to license terms and the documentation redistribution policy.

Источник

Оцените статью