package io.katharsis.utils.java; import java.util.NoSuchElementException; import java.util.Objects; public class Optional<T> { private static final Optional<?> EMPTY = new Optional<>(null); private final T value; private Optional(T value) { this.value = value; } public boolean isPresent() { return value != null; } public T get() { if (value == null) { throw new NoSuchElementException("No value present"); } return value; } @SuppressWarnings("unchecked") public static<T> Optional<T> empty() { return (Optional<T>) EMPTY; } public static <T> Optional<T> of(T value) { Objects.requireNonNull(value); return new Optional<>(value); } public static <T> Optional<T> ofNullable(T value) { return value == null ? Optional.<T>empty() : of(value); } }