All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.delta.flink.source.internal.utils.TransitiveOptional Maven / Gradle / Ivy

There is a newer version: 3.2.1
Show newest version
package io.delta.flink.source.internal.utils;


import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.function.Supplier;

/**
 * A container object which may or may not contain a non-null value. It supports chaining through
 *
 * 

*

*

* An example of using {@code TransitiveOptional} class for method chaining where every method * returns {@code TransitiveOptional} instance. In this chain, the next step will be executed ONLY * if the previous one returned an empty {@code TransitiveOptional} *

 *     return getSnapshotFromCheckpoint(checkpointSnapshotVersion)
 *            .or(this::getSnapshotFromStartingVersionOption)
 *            .or(this::getSnapshotFromStartingTimestampOption)
 *            .or(this::getHeadSnapshot)
 *            .get();
 * 
* * @param the type of value * @apiNote This class is a simplified version of Java's {@link java.util.Optional} class. This * class does NOT support all Java's {@code Optional} methods and its goal is NOT to replace Java's * {@code Optional}. Its main and only purpose is to use it whenever you need an Optional chaining * which was introduced in Java 9+ */ public class TransitiveOptional { /** * Common instance for {@code empty()}. */ private static final TransitiveOptional EMPTY = new TransitiveOptional<>(); /** * If non-null, the value; if null, indicates no value is present */ private final T value; /** * Constructs an empty instance. * * @implNote Generally only one empty instance, {@link TransitiveOptional#EMPTY}, should exist * per VM. */ private TransitiveOptional() { this.value = null; } /** * Constructs an instance with the described value. * * @param value the non-{@code null} value to describe * @throws NullPointerException if value is {@code null} */ private TransitiveOptional(T value) { Objects.requireNonNull(value); this.value = value; } /** * Returns an {@code TransitiveOptional} describing the given non-{@code null} value. * * @param value the value to describe, which must be non-{@code null} * @param the type of the value * @return an {@code TransitiveOptional} with the value present * @throws NullPointerException if value is {@code null} */ public static TransitiveOptional of(T value) { return new TransitiveOptional<>(value); } /** * Returns an {@code TransitiveOptional} describing the given value, if non-{@code null}, * otherwise returns an empty {@code TransitiveOptional}. * * @param value the possibly-{@code null} value to describe * @param the type of the value * @return an {@code TransitiveOptional} with a present value if the specified value is * non-{@code null}, otherwise an empty {@code TransitiveOptional} */ public static TransitiveOptional ofNullable(T value) { return value == null ? empty() : of(value); } /** * Returns an empty {@code TransitiveOptional} instance. No value is present for this {@code * TransitiveOptional}. * * @param The type of the non-existent value * @return an empty {@code TransitiveOptional} */ public static TransitiveOptional empty() { @SuppressWarnings("unchecked") TransitiveOptional t = (TransitiveOptional) EMPTY; return t; } /** * If a value is present, returns the value, otherwise throws {@code NoSuchElementException}. * * @return the non-{@code null} value described by this {@code TransitiveOptional} * @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 an {@code TransitiveOptional} describing the value, otherwise * returns an {@code TransitiveOptional} produced by the supplying function. * * @param supplier the supplying function that produces an {@code TransitiveOptional} to be * returned * @return returns an {@code TransitiveOptional} describing the value of this {@code * TransitiveOptional}, if a value is present, otherwise an {@code TransitiveOptional} produced * by the supplying function. * @throws NullPointerException if the supplying function is {@code null} or produces a {@code * null} result */ public TransitiveOptional or(Supplier> supplier) { Objects.requireNonNull(supplier); if (value != null) { return this; } else { @SuppressWarnings("unchecked") TransitiveOptional r = (TransitiveOptional) supplier.get(); return Objects.requireNonNull(r); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy