Java Optional Class Methods with Examples

In this tutorial, we will take a look into how to use the Optional class to avoid null checks and NullPointerException. 

Well, the NullPointerException is one of the well-known exceptions that frequently occurs in day-to-day project work right and NullPointerException is like a close friend to the java programmer because whenever we write a program or whenever we work on java project then this null pointer exception will frequently occur all right. 

Video

Java 8 has introduced a new Optional utility class in java.util package. This class can help in avoiding null checks and NullPointerException exceptions.

You can view Optional as a single-value container that either contains a value or doesn't (it is then said to be "empty").

Let's understand some of the frequently or commonly used Java 8 Optional Class methods with examples.

Creating Optional Objects

There are several ways of creating Optional objects.

empty() Method

To create an empty Optional object, we simply need to use its empty() static method:
        Optional<Object> emptyOptional = Optional.empty();

of() Method

The of() static method returns an Optional with the specified present non-null value.

        Optional<String> emailOptional = Optional.of("[email protected]");

ofNullable() Method

The ofNullable() static method returns an Optional describing the specified value, if non-null, otherwise returns an empty Optional.
        Optional<String> stringOptional = Optional.ofNullable("[email protected]");

Here is the complete example with output:

import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";

        // of, empty, ofNullable
        Optional<Object> emptyOptional = Optional.empty();
        System.out.println(emptyOptional);

        Optional<String> emailOptional = Optional.of(email);
        System.out.println(emailOptional);

        Optional<String> stringOptional = Optional.ofNullable(email);
        System.out.println(stringOptional);
    }
}

Output:

Optional.empty
Optional[[email protected]]
Optional[[email protected]]

Get Value from Optional

get() Method

The get() method returns a value if it is present in this Optional otherwise throws NoSuchElementException.

package com.java.lambda.optional;

import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";
        Optional<String> stringOptional = Optional.ofNullable(email);
        String value = stringOptional.get();
        System.out.println(value);
    }
}
Output:

Checking Value Presence

isPresent() Method

The isPresent() method returns true if there is a value present, otherwise false.
import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";
        Optional<String> stringOptional = Optional.ofNullable(email);
        if(stringOptional.isPresent()){
            System.out.println(stringOptional.get());
        }else{
            System.out.println("no value present");
        }
    }
}
Output:

Retrieve Default Value

orElse() Method

The orElse() method returns the value if present, otherwise return other (default value).

In the below example, orElse() method return default value because Optional contains null value:
import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = null;
        Optional<String> stringOptional = Optional.ofNullable(email);
        String defaultOptional = stringOptional.orElse("[email protected]");
        System.out.println(defaultOptional);
    }
}
Output:
In the below example, orElse() method return actual value because Optional contains actual value:
import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";
        Optional<String> stringOptional = Optional.ofNullable(email);
        String defaultOptional = stringOptional.orElse("[email protected]");
        System.out.println(defaultOptional);
    }
}

orElseGet() Method

The orElseGet() method returns the value if present, otherwise invoke other and return the result of that invocation.

In the below example, orElseGet() method return default value because Optional contains null value:

import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = null;
        Optional<String> stringOptional = Optional.ofNullable(email);
        String defaultOptional2 = stringOptional.orElseGet(() -> "[email protected]");
        System.out.println(defaultOptional2);
    }
}
In the below example, orElse() method return actual value because Optional contains actual value:
import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";
        Optional<String> stringOptional = Optional.ofNullable(email);
        String defaultOptional2 = stringOptional.orElseGet(() -> "[email protected]");
        System.out.println(defaultOptional2);
    }
}

Handling Exceptions with Optional

orElseThrow() Method

The orElseThrow() method returns the contained value, if present, otherwise throw an exception to be created by the provided supplier.

In the below example, we pass a null value to the Optional object so orElseThrow() method throws an exception to be created by the provided supplier.

package com.java.lambda.optional;

import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = null;
        Optional<String> stringOptional = Optional.ofNullable(email);
        String optionalObject = stringOptional.orElseThrow(() -> new IllegalArgumentException("Email is not exist"));
        System.out.println(optionalObject);
    }
}

Output:

Exception in thread "main" java.lang.IllegalArgumentException: Email is not exist
	at com.java.lambda.optional.OptionalDemo.lambda$main$0(OptionalDemo.java:10)
	at java.base/java.util.Optional.orElseThrow(Optional.java:403)
	at com.java.lambda.optional.OptionalDemo.main(OptionalDemo.java:10)
In the below example, we pass a non-null value to the Optional object so orElseThrow() method returns a value from the Optional object:
import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String email = "[email protected]";
        Optional<String> stringOptional = Optional.ofNullable(email);
        String optionalObject = stringOptional.orElseThrow(() -> new IllegalArgumentException("Email is not exist"));
        System.out.println(optionalObject);
    }
}

Output:

Optional filter() and map() Methods

filter() Method

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

public class OptionalDemo {
    public static void main(String[] args) {

        // without Optional
        String result = "abc";
        if(result != null && result.contains("abc")){
            System.out.println(result);
        }

        // with Optional
        Optional<String> optionalStr = Optional.of(result);
        optionalStr.filter(res -> res.contains("abc"))
                .ifPresent((res) -> System.out.println(res));
    }
}

Output:

abc
abc

map() Method

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.

import java.util.Optional;

public class OptionalDemo {
    public static void main(String[] args) {

        String result = " abc ";
        if(result != null && result.contains("abc")){
            System.out.println(result);
        }

        Optional<String> optionalStr = Optional.of(result);
        optionalStr.filter(res -> res.contains("abc"))
                .map(String::trim)
                .ifPresent((res) -> System.out.println(res));
    }
}


Output:

Comments