If the result of get("jcr:description") can be null, you shouldn’t invoke toString() on it, as there is nothing, Optional can do, if the operation before its use already failed with a NullPointerException.

What you want, can be achieved using:

Optional<String> stringToUse = Optional.ofNullable(
    childPage.getContentResource().getValueMap().get("jcr:description")
).map(Object::toString);

Then you may use it as

if(stringToUse.isPresent())
    description = stringToUse.get();

if “do nothing” is the intended action for the value not being present. Or you can specify a fallback value for that case:

description = stringToUse.orElse("");

then, description is always assigned, either with the string representation of jcr:description or with an empty string.

You can use stringToUse.ifPresent(string -> description = string);, if description is not a local variable, but a field. However, I don’t recommend it.

Answer from Holger on Stack Overflow
🌐
Medium
medium.com › javarevisited › null-check-vs-optional-are-they-same-c361d15fade3
Null Check vs Optional? What's the difference ? How to use Optional | Javarevisited
November 4, 2020 - When this question was asked in an interview, like everyone I answered “Java 8 has introduced this new class Optional in java.util package. By using Optional, we are avoiding null checks and can specify alternate values to return, thus making our code more readable.”
🌐
Oracle
oracle.com › java › technical details
Tired of Null Pointer Exceptions? Consider Using Java SE 8's Optional!
Scala has a similar construct called Option[T] to encapsulate the presence or absence of a value of type T. You then have to explicitly check whether a value is present or not using operations available on the Option type, which enforces the idea of "null checking." You can no longer "forget to do it" because it is enforced by the type system. OK, we diverged a bit and all this sounds fairly abstract. You might now wonder, "so, what about Java SE 8?"
🌐
Baeldung
baeldung.com › home › java › core java › guide to java optional
Guide To Java Optional | Baeldung
January 16, 2024 - Note that we used the isPresent() method to check if there is a value inside the Optional object. A value is present only if we have created Optional with a non-null value.
Top answer
1 of 9
23

Optional harnesses the type system for doing work that you'd otherwise have to do all in your head: remembering whether or not a given reference may be null. This is good. It's always smart to let the compiler handle boring drugework, and reserve human thought for creative, interesting work.

Without Optional, every reference in your code is like an unexploded bomb. Accessing it may do something useful, or else it may terminate your program wth an exception.

With Optional and without null, every access to a normal reference succeeds, and every reference to an Optional succeeds unless it's unset and you failed to check for that. That is a huge win in maintainability.

Unfortunately, most languages that now offer Optional haven't abolished null, so you can only profit from the concept by instituting a strict policy of "absolutely no null, ever". Therefore, Optional in e.g. Java is not as compelling as it should ideally be.

2 of 9
23

An Optional brings stronger typing into operations that may fail, as the other answers have covered, but that is far from the most interesting or valuable thing Optionals bring to the table. Much more useful is the ability to delay or avoid checking for failure, and to easily compose many operations that may fail.

Consider if you had your optional variable from your example code, then you had to perform two additional steps that each might potentially fail. If any step along the way fails, you want to return a default value instead. Using Optionals correctly, you end up with something like this:

return optional.flatMap(x -> x.anotherOptionalStep())
               .flatMap(x -> x.yetAnotherOptionalStep())
               .orElse(defaultValue);

With null I would have had to check three times for null before proceeding, which adds a lot of complexity and maintenance headaches to the code. Optionals have that check built in to the flatMap and orElse functions.

Note I didn't call isPresent once, which you should think of as a code smell when using Optionals. That doesn't necessarily mean you should never use isPresent, just that you should heavily scrutinize any code that does, to see if there is a better way. Otherwise, you're right, you're only getting a marginal type safety benefit over using null.

Also note that I'm not as worried about encapsulating this all into one function, in order to protect other parts of my code from null pointers from intermediate results. If it makes more sense to have my .orElse(defaultValue) in another function for example, I have much fewer qualms about putting it there, and it's much easier to compose the operations between different functions as needed.

🌐
DZone
dzone.com › coding › java › java 8 optional: handling nulls properly
Java 8 Optional: Handling Nulls Properly
June 18, 2018 - Java 8 introduced the Optionalclass to make handling of nulls less error-prone. For example, the following program to pick the lucky name has a null check as:
🌐
Readthedocs
java-8-tips.readthedocs.io › en › stable › optional.html
10. Handling nulls with Optional — Java 8 tips 1.0 documentation
No need to document separetely to represent nullable members, model class Optional types are self documentary. As an example spouse and jobProfile clearly mentions that they can be null. No need to write null checks explicitely, operations will be performed only if value is present.
🌐
Medium
medium.com › @reetesh043 › java-optional-avoiding-null-pointer-exceptions-made-easy-d44e34b7c3e1
Java Optional: Avoiding Null Pointer Exceptions Made Easy | by Reetesh Kumar | Medium
February 9, 2024 - Alternatively, we can use the ofNullable() method, which allows us to pass a potentially null value. If the value is null, it will create an empty Optional.
Find elsewhere
Top answer
1 of 11
125

Style 2 isn't going Java 8 enough to see the full benefit. You don't want the if ... use at all. See Oracle's examples. Taking their advice, we get:

Style 3

// Changed EmployeeServive to return an optional, no more nulls!
Optional<Employee> employee = employeeServive.getEmployee();
employee.ifPresent(e -> System.out.println(e.getId()));

Or a more lengthy snippet

Optional<Employee> employee = employeeServive.getEmployee();
// Sometimes an Employee has forgotten to write an up-to-date timesheet
Optional<Timesheet> timesheet = employee.flatMap(Employee::askForCurrentTimesheet); 
// We don't want to do the heavyweight action of creating a new estimate if it will just be discarded
client.bill(timesheet.orElseGet(EstimatedTimesheet::new));
2 of 11
50

If you're using Optional as a "compatibility" layer between an older API that may still return null, it may be helpful to create the (non-empty) Optional at the latest stage that you're sure that you have something. E.g., where you wrote:

Optional<Employee> employeeOptional = Optional.ofNullable(employeeService.getEmployee());
if(employeeOptional.isPresent()){
    Employee employeeOptional= employeeOptional.get();
    System.out.println(employee.getId());
}

I'd opt toward:

Optional.of(employeeService)                 // definitely have the service
        .map(EmployeeService::getEmployee)   // getEmployee() might return null
        .map(Employee::getId)                // get ID from employee if there is one
        .ifPresent(System.out::println);     // and if there is an ID, print it

The point is that you know that there's a non-null employee service, so you can wrap that up in an Optional with Optional.of(). Then, when you call getEmployee() on that, you may or may not get an employee. That employee may (or, possibly, may not) have an ID. Then, if you ended up with an ID, you want to print it.

There's no need to explicitly check for any null, presence, etc., in this code.

🌐
Foojay
foojay.io › home › optional in java: a swiss army knife for handling nulls and improving code quality
Optional in Java: A Swiss Army Knife for Handling Nulls and Improving Code Quality
February 20, 2023 - In this example, we create a JPA Criteria Query, use Optional to handle the case where the query might not have any results, and then use the resulting Optional to perform additional operations. This provides a simple and expressive way to handle JPA Criteria Queries, and avoids null checks and if statements. Optional can be used to simplify database operations in Java.
🌐
Sonar Community
community.sonarsource.com › rules and languages › new rules / language support
[Java] Optional used as replacement for local null check - New rules / language support - Sonar Community
May 27, 2021 - Optionals are often used unnecessarily as tools to perform local null checks instead of using regular if-else statements. My understanding is that they are used because it is a fairly new feature and it looks “modern.” However, there is no functional reason for it, as the same if-else statements are executed beneath the API.
🌐
Reddit
reddit.com › r/java › why does optional require a non-null value?
r/java on Reddit: Why does Optional require a non-null value?
June 13, 2024 -

Since the whole purpose of Optional is to represent values that might not exist, why does the constructor of Optional require a non-null value? Is it becuase they wanted to coalesce all empty Optionals down to a single instance? Even if that's true, why not make Optional.of() behave the way Optional.ofNullable() and do away with the ofNullable() method?

Edit to clarify my opinion and respond to some of the points raised:

My opinion stated clearly, is only two "constructor" methods should exist:

  • of (and it should work like the current ofNullable method)

  • empty

So far the arguments against my opinion have been:

  1. Having .of() and .ofNullable() makes it clear at the point of construction when the value exists and when it might not exist.

This is true, but that clarity is redundant. For safety, the call to .of() will either be inside the not-null branch of a null-check, or come after a not-null assertion. So even if .of() behaved as .ofNullable() does it would be clear that the value exists.

2. It guards against changes in behavior of the the methods supplying the values. If one of the supplying methods suddenly changes from never returning nulls to sometime returning nulls it will catch the error.

I would argue that guarding against this occurrence is the responsibility of the function returning the Optional values, and not the responsibility of Optional. If the function needs to guard against a null value so that it can handle it in some fashion (eg. by calling another supplier method) then then it needs to implement the not-null assertion explicitly in the body of its code. This is more clear than relying on an class called Optional do something that is semantically at odds with the plain reading of its class name.

In the case where the function doesn't care whether the value returned from the supplier is null or not, it should simply be able to call .of() to create the optional and return it.

🌐
JetBrains
jetbrains.com › help › inspectopedia › OptionalOfNullableMisuse.html
Use of Optional.ofNullable with null or not-null argument | Inspectopedia Documentation
Optional<String> empty = Optional.ofNullable(null); // should be Optional.empty(); Optional<String> present = Optional.ofNullable("value"); // should be Optional.of("value"); ... Can be used to locate inspection in e.g. Qodana configuration files, where you can quickly enable or disable it, or adjust its settings. ... Path to the inspection settings via IntelliJ Platform IDE Settings dialog, when you need to adjust inspection settings directly from your IDE. Settings or Preferences | Editor | Inspections | Java | Probable bugs
🌐
Javacodehouse
javacodehouse.com › blog › java-nullable-list-first-item
Java 8 Optional - Avoid the explicit null check on list
Using Optional expresses the intent more clearly: “I want the first item of the list if it is present and not empty.” · Separates the null check, filtering, and mapping, making each step more explicit.
Top answer
1 of 3
63

In practice, why is this useful?

For example let's say you have this stream of integers and you're doing a filtering:

int x = IntStream.of(1, -3, 5)
                 .filter(x -> x % 2 == 0)
                 .findFirst(); //hypothetical assuming that there's no Optional in the API

You don't know in advance that the filter operation will remove all the values in the Stream.

Assume that there would be no Optional in the API. In this case, what should findFirst return?

The only possible way would be to throw an exception such as NoSuchElementException, which is IMO rather annoying, as I don't think it should stop the execution of your program (or you'd have to catch the exception, not very convenient either) and the filtering criteria could be more complex than that.

With the use of Optional, it's up to the caller to check whether the Optional is empty or not (i.e if your computation resulted in a value or not).

With reference type, you could also return null (but null could be a possible value in the case you filter only null values; so we're back to the exception case).

Concerning non-stream usages, in addition to prevent NPE, I think it also helps to design a more explicit API saying that the value may be present or not. For example consider this class:

class Car {
   RadioCar radioCar; //may be null or not 
   public Optional<RadioCar> getRadioCar() {
        return Optional.ofNullable(radioCar);
   }
}

Here you are clearly saying to the caller that the radio in the car is optional, it might be or not there.

2 of 3
32

When Java was first designed it was common practice to use a special value, usually called null to indicate special circumstances like I couldn't find what you were looking for. This practice was adopted by Java.

Since then it has been suggested that this practice should be considered an anti-pattern, especially for objects, because it means that you have to litter your code with null checks to achieve reliability and stability. It is also a pain when you want to put null into a collection for example.

The modern attitude is to use a special object that may or may not hold a value. This way you can safely create one and just not fill it with anything. Here you are seeing Java 8 encouraging this best-practice by providing an Optional object.

🌐
DZone
dzone.com › coding › java › java 8 optional - avoid null and nullpointerexception altogether - and keep it pretty
Java 8 Optional - Avoid Null and NullPointerException Altogether - and Keep It Pretty
September 27, 2014 - There are other ways to do it (map + flatMap to Optional::ofNullable is one). The best one: only return optional value where it makes sense: if you know the value will always be provided, make it non-optional. By the way, this advice works for old style null checks too.
🌐
DEV Community
dev.to › developersmill › remove-null-check-use-the-optional-5ej6
Remove null check, use the Optional - DEV Community
July 21, 2022 - public void displayNumberOfMoviesRentInCurrentMonth(User user) { System.out.println(getTotal(user.getRentHistory()) .map(total -> "Number of movies user has rented in this month is: " + total) .orElse("User has not rented any movie in the current month")); } private Optional<Integer> getTotal(RentHistory history) { if (history == null){ return Optional.empty(); } return Optional.ofNullable(history.getTotalInCurrentMonth()); } Is this is the final solution that we really want, adding a null check, again, defensive programming.
🌐
Reddit
reddit.com › r/java › when somethings is null: optional.ofnullable.orelse/ifpresent vs if-else
When somethings is null: Optional.ofNullable.orElse/ifPresent vs if-else : r/java
June 14, 2021 - You would probably work a little bit differently with this, I would have written the happy path and throw exceptions in between pre java 8 or use some other little helper to get around writing so many ifs. If this is all REST. I'd use a library like reactor. If you want to use the result, you'll have to do a null check again, and we don't know whether the argument may be nullable either. ... Optional<InterestingValue> getInterestingValue (String name) { return Optional.of(name) .map(API::getId) .map(API::getObject) .filter(InterestingObject::isInteresting) .map(InterestingObject::getValue) }
🌐
j-labs
j-labs.pl › home › tech blog › how to use and how not to use optional in java
How to use and how not to use Optional in Java | j‑labs
February 11, 2025 - filter(Predicate predicate) If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional. ... To take a colour of a table which is in the room in your house, you ...