Package cms.util.maybe
Class Maybe<T>
java.lang.Object
cms.util.maybe.Maybe<T>
- All Implemented Interfaces:
Iterable<T>
An object that may contain a value of type
T. Similar to
Java's Optional class but uses a fast checked exception instead of
a slow unchecked exception.-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic <T,U extends T>
Maybe<T>Convert aMaybe<U>to aMaybe<T>, whenTis a supertype ofU.static <T> Maybe<T>from(T v) Create a Maybe from a possibly null value v.static <T> Maybe<T>fromOptional(Optional<T> optional) Create aMaybefrom anOptionalvalue.abstract Tget()Returns the contained value, if present.static <T> TgetOptional(Optional<T> optional) Get the value in anOptional, if present; otherwise throw the checked exceptionNoMaybeValue.abstract booleanReturns whether a value is contained in thisMaybe.iterator()Provide an iterator that yields either oneTor none, depending.static <T> Maybe<T>none()Returns an emptyMaybe.abstract TReturns the contained value, if any; otherwise, returnsother.abstract TReturns the contained value, if any; otherwise, returnsother.get().orElseMaybe(Supplier<Maybe<T>> other) Returns this if a value is contained; otherwise, returnsother.get().orElseThrow(E throwable) Returns the contained value, if any; otherwise, throws the specified exception.static <T> Maybe<T>some(T v) Creates aMaybefrom a non-null argument.abstract <U> Maybe<U>If a valuevis present, returns aMaybecontainingf(v), which must be non-null.abstract voidCallconson the contained value, if any.abstract voidIf a value is contained, run consThen on the value; otherwise run procElseabstract <U> Maybe<U>If a valuevis present, returnsf(v).Create anOptionalfrom aMaybeMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface java.lang.Iterable
forEach, spliterator
-
Constructor Details
-
Maybe
protected Maybe()Do nothing.
-
-
Method Details
-
isPresent
public abstract boolean isPresent()Returns whether a value is contained in thisMaybe.- Returns:
- whether a value is contained.
-
get
Returns the contained value, if present. Otherwise, throws the exception.- Returns:
- the contained value
- Throws:
NoMaybeValue- if no value is contained in this Maybe. This method is primarily useful for writing code that is supposed to perform side effects, e.g.:Maybe
<T>m = ... try { ... m.get() ... } catch (NoMaybeValue e) { ... }
-
thenMaybe
If a valuevis present, returnsf(v). Otherwise, returns an emptyMaybe. (This is a monadic bind.) This method is useful for chaining together a series ofMaybeaccesses. For example, supposingT.foo()returns a Maybe:Maybe<T> mt = ... mt.thenMaybe(t -> t.foo().then(f -> ...)) .orElse(...)- Type Parameters:
U- The type of the value that may be returned by the functionf.- Parameters:
f- The function to be applied to the contained value, if any.- Returns:
- the
Maybereturned byf, if a value is contained in thisMaybe. Otherwise, an emptyMaybe.
-
then
If a valuevis present, returns aMaybecontainingf(v), which must be non-null. Otherwise, returns an emptyMaybe. (This is a monadic bind composed with a monadic unit.) This method can be used conveniently along with orElse to handle both maybe cases, e.g.:Maybe<T> mt = ... mt.then(t -> ...) .orElse(...)- Type Parameters:
U- The type of the value that may be returned by the functionf.- Parameters:
f- The function to be applied to the contained value, if any.- Returns:
- a
Maybecontaining the valuef, if a value is contained in thisMaybe. Otherwise, an emptyMaybe.
-
orElse
Returns the contained value, if any; otherwise, returnsother. Note: since orElse is an ordinary method call, its argument is always computed, unlike a Javaelsestatement. If the argument is expensive to compute or has side effects,orElseGet()should be used instead.- Parameters:
other- The value to be returned if no value is in thisMaybe.- Returns:
- The contained value, or an empty
Maybe.
-
orElseGet
Returns the contained value, if any; otherwise, returnsother.get().- Parameters:
other- The function to use when thisMaybeis empty.- Returns:
- the contained value or
other.get().
-
orElseThrow
Returns the contained value, if any; otherwise, throws the specified exception.- Throws:
E extends Throwable
-
orElseMaybe
Returns this if a value is contained; otherwise, returnsother.get().- Parameters:
other- The function to use when thisMaybeis empty.- Returns:
- this or
other.get().
-
thenDo
Callconson the contained value, if any.- Parameters:
cons- The function to send the contained value to.
-
thenElse
If a value is contained, run consThen on the value; otherwise run procElse -
iterator
Provide an iterator that yields either oneTor none, depending. -
from
Create a Maybe from a possibly null value v. The Maybe will contain a value if v is non-null.- Type Parameters:
T- The type ofMaybeto be created.- Parameters:
v- The value to put into aMaybe, or null.
-
fromOptional
Create aMaybefrom anOptionalvalue.- Type Parameters:
T- The type of the value inside theOptional.- Parameters:
optional- TheOptionalvalue.- Returns:
- If the
Optionalcontains a value, then Some of that value, otherwise None.
-
toOptional
Create anOptionalfrom aMaybe -
getOptional
Get the value in anOptional, if present; otherwise throw the checked exceptionNoMaybeValue. This method allowsOptionals to be used as if they were Maybes.- Returns:
- The value in the optional, if any
- Throws:
NoMaybeValue- if no value is present.
-
none
Returns an emptyMaybe. -
some
Creates aMaybefrom a non-null argument.- Parameters:
v- must be non-null- Throws:
IllegalArgumentException- if a null value is passed to it.
-
cast
Convert aMaybe<U>to aMaybe<T>, whenTis a supertype ofU. This covariant subtyping is safe becauseMaybes are immutable.
-