/*
 * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package java.util;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream;

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; 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.

Type parameters:
  • <T> – the type of value
API Note: Optional is primarily intended for use as a method return type where there is a clear need to represent "no result," and where using null is likely to cause errors. A variable whose type is Optional should never itself be null; it should always point to an Optional instance.
Since:1.8
/** * A container object which may or may not contain a non-{@code null} value. * If a value is present, {@code isPresent()} returns {@code true}. If no * value is present, the object is considered <i>empty</i> and * {@code isPresent()} returns {@code false}. * * <p>Additional methods that depend on the presence or absence of a contained * value are provided, such as {@link #orElse(Object) orElse()} * (returns a default value if no value is present) and * {@link #ifPresent(Consumer) ifPresent()} (performs an * action if a value is present). * * <p>This is a <a href="../lang/doc-files/ValueBased.html">value-based</a> * class; use of identity-sensitive operations (including reference equality * ({@code ==}), identity hash code, or synchronization) on instances of * {@code Optional} may have unpredictable results and should be avoided. * * @apiNote * {@code Optional} is primarily intended for use as a method return type where * there is a clear need to represent "no result," and where using {@code null} * is likely to cause errors. A variable whose type is {@code Optional} should * never itself be {@code null}; it should always point to an {@code Optional} * instance. * * @param <T> the type of value * @since 1.8 */
public final class Optional<T> {
Common instance for empty().
/** * Common instance for {@code empty()}. */
private static final Optional<?> EMPTY = new Optional<>();
If non-null, the value; if null, indicates no value is present
/** * If non-null, the value; if null, indicates no value is present */
private final T value;
Constructs an empty instance.
Implementation Note:Generally only one empty instance, EMPTY, should exist per VM.
/** * Constructs an empty instance. * * @implNote Generally only one empty instance, {@link Optional#EMPTY}, * should exist per VM. */
private Optional() { this.value = null; }
Returns an empty Optional instance. No value is present for this Optional.
Type parameters:
  • <T> – The type of the non-existent value
API Note: Though it may be tempting to do so, avoid testing if an object is empty by comparing with == against instances returned by Optional.empty(). There is no guarantee that it is a singleton. Instead, use isPresent().
Returns:an empty Optional
/** * Returns an empty {@code Optional} instance. No value is present for this * {@code Optional}. * * @apiNote * Though it may be tempting to do so, avoid testing if an object is empty * by comparing with {@code ==} against instances returned by * {@code Optional.empty()}. There is no guarantee that it is a singleton. * Instead, use {@link #isPresent()}. * * @param <T> The type of the non-existent value * @return an empty {@code Optional} */
public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }
Constructs an instance with the described value.
Params:
  • value – the non-null value to describe
Throws:
/** * Constructs an instance with the described value. * * @param value the non-{@code null} value to describe * @throws NullPointerException if value is {@code null} */
private Optional(T value) { this.value = Objects.requireNonNull(value); }
Returns an Optional describing the given non-null value.
Params:
  • value – the value to describe, which must be non-null
Type parameters:
  • <T> – the type of the value
Throws:
Returns:an Optional with the value present
/** * Returns an {@code Optional} describing the given non-{@code null} * value. * * @param value the value to describe, which must be non-{@code null} * @param <T> the type of the value * @return an {@code Optional} with the value present * @throws NullPointerException if value is {@code null} */
public static <T> Optional<T> of(T value) { return new Optional<>(value); }
Returns an Optional describing the given value, if non-null, otherwise returns an empty Optional.
Params:
  • value – the possibly-null value to describe
Type parameters:
  • <T> – the type of the value
Returns:an Optional with a present value if the specified value is non-null, otherwise an empty Optional
/** * Returns an {@code Optional} describing the given value, if * non-{@code null}, otherwise returns an empty {@code Optional}. * * @param value the possibly-{@code null} value to describe * @param <T> the type of the value * @return an {@code Optional} with a present value if the specified value * is non-{@code null}, otherwise an empty {@code Optional} */
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
If a value is present, returns the value, otherwise throws NoSuchElementException.
Throws:
API Note: The preferred alternative to this method is orElseThrow().
Returns:the non-null value described by this Optional
/** * If a value is present, returns the value, otherwise throws * {@code NoSuchElementException}. * * @apiNote * The preferred alternative to this method is {@link #orElseThrow()}. * * @return the non-{@code null} value described by this {@code Optional} * @throws NoSuchElementException if no value is present */
public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; }
If a value is present, returns true, otherwise false.
Returns:true if a value is present, otherwise false
/** * If a value is present, returns {@code true}, otherwise {@code false}. * * @return {@code true} if a value is present, otherwise {@code false} */
public boolean isPresent() { return value != null; }
If a value is not present, returns true, otherwise false.
Returns: true if a value is not present, otherwise false
Since: 11
/** * If a value is not present, returns {@code true}, otherwise * {@code false}. * * @return {@code true} if a value is not present, otherwise {@code false} * @since 11 */
public boolean isEmpty() { return value == null; }
If a value is present, performs the given action with the value, otherwise does nothing.
Params:
  • action – the action to be performed, if a value is present
Throws:
/** * If a value is present, performs the given action with the value, * otherwise does nothing. * * @param action the action to be performed, if a value is present * @throws NullPointerException if value is present and the given action is * {@code null} */
public void ifPresent(Consumer<? super T> action) { if (value != null) { action.accept(value); } }
If a value is present, performs the given action with the value, otherwise performs the given empty-based action.
Params:
  • action – the action to be performed, if a value is present
  • emptyAction – the empty-based action to be performed, if no value is present
Throws:
  • NullPointerException – if a value is present and the given action is null, or no value is present and the given empty-based action is null.
Since:9
/** * If a value is present, performs the given action with the value, * otherwise performs the given empty-based action. * * @param action the action to be performed, if a value is present * @param emptyAction the empty-based action to be performed, if no value is * present * @throws NullPointerException if a value is present and the given action * is {@code null}, or no value is present and the given empty-based * action is {@code null}. * @since 9 */
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) { if (value != null) { action.accept(value); } else { emptyAction.run(); } }
If a value is present, and the value matches the given predicate, returns an Optional describing the value, otherwise returns an empty Optional.
Params:
  • predicate – the predicate to apply to a value, if present
Throws:
Returns:an Optional describing the value of this Optional, if a value is present and the value matches the given predicate, otherwise an empty Optional
/** * If a value is present, and the value matches the given predicate, * returns an {@code Optional} describing the value, otherwise returns an * empty {@code Optional}. * * @param predicate the predicate to apply to a value, if present * @return an {@code Optional} describing the value of this * {@code Optional}, if a value is present and the value matches the * given predicate, otherwise an empty {@code Optional} * @throws NullPointerException if the predicate is {@code null} */
public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) { return this; } else { return predicate.test(value) ? this : empty(); } }
If a value is present, returns an Optional describing (as if by ofNullable) 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.

Params:
  • mapper – the mapping function to apply to a value, if present
Type parameters:
  • <U> – The type of the value returned from the mapping function
Throws:
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<Path>:

    Optional<Path> p =
        uris.stream().filter(uri -> !isProcessedYet(uri))
                      .findFirst()
                      .map(Paths::get);
Here, findFirst returns an Optional<URI>, and then map returns an Optional<Path> for the desired URI if one exists.
Returns:an Optional describing the result of applying a mapping function to the value of this Optional, if a value is present, otherwise an empty Optional
/** * If a value is present, returns an {@code Optional} describing (as if by * {@link #ofNullable}) the result of applying the given mapping function to * the value, otherwise returns an empty {@code Optional}. * * <p>If the mapping function returns a {@code null} result then this method * returns an empty {@code Optional}. * * @apiNote * This method supports post-processing on {@code 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 {@code Optional<Path>}: * * <pre>{@code * Optional<Path> p = * uris.stream().filter(uri -> !isProcessedYet(uri)) * .findFirst() * .map(Paths::get); * }</pre> * * Here, {@code findFirst} returns an {@code Optional<URI>}, and then * {@code map} returns an {@code Optional<Path>} for the desired * URI if one exists. * * @param mapper the mapping function to apply to a value, if present * @param <U> The type of the value returned from the mapping function * @return an {@code Optional} describing the result of applying a mapping * function to the value of this {@code Optional}, if a value is * present, otherwise an empty {@code Optional} * @throws NullPointerException if the mapping function is {@code null} */
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) { return empty(); } else { return Optional.ofNullable(mapper.apply(value)); } }
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.

Params:
  • mapper – the mapping function to apply to a value, if present
Type parameters:
  • <U> – The type of value of the Optional returned by the mapping function
Throws:
Returns:the result of applying an Optional-bearing mapping function to the value of this Optional, if a value is present, otherwise an empty Optional
/** * If a value is present, returns the result of applying the given * {@code Optional}-bearing mapping function to the value, otherwise returns * an empty {@code Optional}. * * <p>This method is similar to {@link #map(Function)}, but the mapping * function is one whose result is already an {@code Optional}, and if * invoked, {@code flatMap} does not wrap it within an additional * {@code Optional}. * * @param <U> The type of value of the {@code Optional} returned by the * mapping function * @param mapper the mapping function to apply to a value, if present * @return the result of applying an {@code Optional}-bearing mapping * function to the value of this {@code Optional}, if a value is * present, otherwise an empty {@code Optional} * @throws NullPointerException if the mapping function is {@code null} or * returns a {@code null} result */
public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) { return empty(); } else { @SuppressWarnings("unchecked") Optional<U> r = (Optional<U>) mapper.apply(value); return Objects.requireNonNull(r); } }
If a value is present, returns an Optional describing the value, otherwise returns an Optional produced by the supplying function.
Params:
  • supplier – the supplying function that produces an Optional to be returned
Throws:
Returns:returns an Optional describing the value of this Optional, if a value is present, otherwise an Optional produced by the supplying function.
Since:9
/** * If a value is present, returns an {@code Optional} describing the value, * otherwise returns an {@code Optional} produced by the supplying function. * * @param supplier the supplying function that produces an {@code Optional} * to be returned * @return returns an {@code Optional} describing the value of this * {@code Optional}, if a value is present, otherwise an * {@code Optional} produced by the supplying function. * @throws NullPointerException if the supplying function is {@code null} or * produces a {@code null} result * @since 9 */
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) { Objects.requireNonNull(supplier); if (isPresent()) { return this; } else { @SuppressWarnings("unchecked") Optional<T> r = (Optional<T>) supplier.get(); return Objects.requireNonNull(r); } }
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<Optional<T>> os = ..
    Stream<T> s = os.flatMap(Optional::stream)
Returns:the optional value as a Stream
Since:9
/** * If a value is present, returns a sequential {@link Stream} containing * only that value, otherwise returns an empty {@code Stream}. * * @apiNote * This method can be used to transform a {@code Stream} of optional * elements to a {@code Stream} of present value elements: * <pre>{@code * Stream<Optional<T>> os = .. * Stream<T> s = os.flatMap(Optional::stream) * }</pre> * * @return the optional value as a {@code Stream} * @since 9 */
public Stream<T> stream() { if (!isPresent()) { return Stream.empty(); } else { return Stream.of(value); } }
If a value is present, returns the value, otherwise returns other.
Params:
  • other – the value to be returned, if no value is present. May be null.
Returns:the value, if present, otherwise other
/** * If a value is present, returns the value, otherwise returns * {@code other}. * * @param other the value to be returned, if no value is present. * May be {@code null}. * @return the value, if present, otherwise {@code other} */
public T orElse(T other) { return value != null ? value : other; }
If a value is present, returns the value, otherwise returns the result produced by the supplying function.
Params:
  • supplier – the supplying function that produces a value to be returned
Throws:
Returns:the value, if present, otherwise the result produced by the supplying function
/** * If a value is present, returns the value, otherwise returns the result * produced by the supplying function. * * @param supplier the supplying function that produces a value to be returned * @return the value, if present, otherwise the result produced by the * supplying function * @throws NullPointerException if no value is present and the supplying * function is {@code null} */
public T orElseGet(Supplier<? extends T> supplier) { return value != null ? value : supplier.get(); }
If a value is present, returns the value, otherwise throws NoSuchElementException.
Throws:
Returns:the non-null value described by this Optional
Since:10
/** * If a value is present, returns the value, otherwise throws * {@code NoSuchElementException}. * * @return the non-{@code null} value described by this {@code Optional} * @throws NoSuchElementException if no value is present * @since 10 */
public T orElseThrow() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; }
If a value is present, returns the value, otherwise throws an exception produced by the exception supplying function.
Params:
  • exceptionSupplier – the supplying function that produces an exception to be thrown
Type parameters:
  • <X> – Type of the exception to be thrown
Throws:
  • X – if no value is present
  • NullPointerException – if no value is present and the exception supplying function is null
API Note: A method reference to the exception constructor with an empty argument list can be used as the supplier. For example, IllegalStateException::new
Returns:the value, if present
/** * If a value is present, returns the value, otherwise throws an exception * produced by the exception supplying function. * * @apiNote * A method reference to the exception constructor with an empty argument * list can be used as the supplier. For example, * {@code IllegalStateException::new} * * @param <X> Type of the exception to be thrown * @param exceptionSupplier the supplying function that produces an * exception to be thrown * @return the value, if present * @throws X if no value is present * @throws NullPointerException if no value is present and the exception * supplying function is {@code null} */
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }
Indicates whether some other object is "equal to" this Optional. The other object is considered equal if:
  • it is also an Optional and;
  • both instances have no value present or;
  • the present values are "equal to" each other via equals().
Params:
  • obj – an object to be tested for equality
Returns:true if the other object is "equal to" this object otherwise false
/** * Indicates whether some other object is "equal to" this {@code Optional}. * The other object is considered equal if: * <ul> * <li>it is also an {@code Optional} and; * <li>both instances have no value present or; * <li>the present values are "equal to" each other via {@code equals()}. * </ul> * * @param obj an object to be tested for equality * @return {@code true} if the other object is "equal to" this object * otherwise {@code false} */
@Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Optional)) { return false; } Optional<?> other = (Optional<?>) obj; return Objects.equals(value, other.value); }
Returns the hash code of the value, if present, otherwise 0 (zero) if no value is present.
Returns:hash code value of the present value or 0 if no value is present
/** * Returns the hash code of the value, if present, otherwise {@code 0} * (zero) if no value is present. * * @return hash code value of the present value or {@code 0} if no value is * present */
@Override public int hashCode() { return Objects.hashCode(value); }
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.
Implementation Requirements: If a value is present the result must include its string representation in the result. Empty and present Optionals must be unambiguously differentiable.
Returns:the string representation of this instance
/** * Returns a non-empty string representation of this {@code Optional} * suitable for debugging. The exact presentation format is unspecified and * may vary between implementations and versions. * * @implSpec * If a value is present the result must include its string representation * in the result. Empty and present {@code Optional}s must be unambiguously * differentiable. * * @return the string representation of this instance */
@Override public String toString() { return value != null ? String.format("Optional[%s]", value) : "Optional.empty"; } }