/*
 * Copyright (c) 2012, 2013, 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 sun.security.util;

import java.util.Objects;
import java.util.NoSuchElementException;

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.

Since:1.8
/** * A container object which may or may not contain a non-null value. * If a value is present, {@code isPresent()} will return {@code true} and * {@code get()} will return the value. * * <p>Additional methods that depend on the presence or absence of a contained * value are provided, such as {@link #orElse(java.lang.Object) orElse()} * (return a default value if value not present) and * {@link #ifPresent(java.util.function.Consumer) ifPresent()} (execute a block * of code if the 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. * * @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 specified value, if non-null, otherwise returns an empty Optional.
Params:
  • value – the possibly-null value to describe
Type parameters:
  • <T> – the class 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 specified value, if non-null, * otherwise returns an empty {@code Optional}. * * @param <T> the class of the value * @param value the possibly-null value to describe * @return an {@code Optional} with a present value if the specified value * is non-null, otherwise an empty {@code Optional} */
public static <T> Optional<T> ofNullable(T value) { return value == null ? new Optional<T>() : 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, 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.
Params:
  • mapper – a mapping function to apply to the value, if present
Type parameters:
  • <U> – The type of the result of 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 file names, selects one that has not yet been processed, and then opens that file, returning an Optional<FileInputStream>:

    Optional<FileInputStream> fis =
        names.stream().filter(name -> !isProcessedYet(name))
                      .findFirst()
                      .map(name -> new FileInputStream(name));
Here, findFirst returns an Optional<String>, and then map returns an Optional<FileInputStream> for the desired file 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, apply the provided mapping function to it, * and if the result is non-null, return an {@code Optional} describing the * result. Otherwise return an empty {@code Optional}. * * @apiNote 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 * {@code Optional<FileInputStream>}: * * <pre>{@code * Optional<FileInputStream> fis = * names.stream().filter(name -> !isProcessedYet(name)) * .findFirst() * .map(name -> new FileInputStream(name)); * }</pre> * * Here, {@code findFirst} returns an {@code Optional<String>}, and then * {@code map} returns an {@code Optional<FileInputStream>} for the desired * file if one exists. * * @param <U> The type of the result of the mapping function * @param mapper a mapping function to apply to the value, if present * @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 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)); } }
Return the value if present, otherwise invoke other and return the result of that invocation.
Params:
  • other – a Supplier whose result is returned if no value is present
Throws:
Returns:the value if present otherwise the result of other.get()
/** * Return the value if present, otherwise invoke {@code other} and return * the result of that invocation. * * @param other a {@code Supplier} whose result is returned if no value * is present * @return the value if present otherwise the result of {@code other.get()} * @throws NullPointerException if value is not present and {@code other} is * null */
public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.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"; } }