Class LazyOptional<T>
- java.lang.Object
-
- net.minecraftforge.common.util.LazyOptional<T>
-
- Type Parameters:
T
- The type of the optional value.
@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class LazyOptional<T> extends java.lang.Object
This object encapsulates a lazy value, with typical transformation operations (map/ifPresent) available, much likeOptional
.It also provides the ability to listen for invalidation, via
addListener(NonNullConsumer)
. This method is invoked when the provider of this object callsinvalidate()
.To create an instance of this class, use
of(NonNullSupplier)
. Note that this accepts aNonNullSupplier
, so the result of the supplier must never be null.The empty instance can be retrieved with
empty()
.
-
-
Field Summary
Fields Modifier and Type Field Description private static LazyOptional<java.lang.Void>
EMPTY
private boolean
isValid
private java.util.Set<NonNullConsumer<LazyOptional<T>>>
listeners
private java.lang.Object
lock
private static org.apache.logging.log4j.Logger
LOGGER
private org.apache.commons.lang3.mutable.Mutable<T>
resolved
private NonNullSupplier<T>
supplier
-
Constructor Summary
Constructors Modifier Constructor Description private
LazyOptional(NonNullSupplier<T> instanceSupplier)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addListener(NonNullConsumer<LazyOptional<T>> listener)
<X> LazyOptional<X>
cast()
This method hides an unchecked cast to the inferred type.static <T> LazyOptional<T>
empty()
java.util.Optional<T>
filter(NonNullPredicate<? super T> predicate)
Resolve the contained supplier if non-empty, and filter it by the givenNonNullPredicate
, returning empty if false.private T
getValue()
private T
getValueUnsafe()
void
ifPresent(NonNullConsumer<? super T> consumer)
If non-empty, invoke the specifiedNonNullConsumer
with the object, otherwise do nothing.void
invalidate()
Invalidate thisLazyOptional
, making it unavailable for further use, and notifying anylisteners
that this has become invalid and they should update.boolean
isPresent()
Check if thisLazyOptional
is non-empty.<U> LazyOptional<U>
lazyMap(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptional
is non-empty, return a newLazyOptional
encapsulating the mapping function.<U> java.util.Optional<U>
map(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptional
is non-empty, return a newOptional
encapsulating the mapped value.static <T> LazyOptional<T>
of(NonNullSupplier<T> instanceSupplier)
Construct a newLazyOptional
that wraps the givenNonNullSupplier
.T
orElse(T other)
Resolve the contained supplier if non-empty and return the result, otherwise returnother
.T
orElseGet(NonNullSupplier<? extends T> other)
Resolve the contained supplier if non-empty and return the result, otherwise return the result ofother
.<X extends java.lang.Throwable>
TorElseThrow(NonNullSupplier<? extends X> exceptionSupplier)
Resolve the contained supplier if non-empty and return the result, otherwise throw the exception created by the providedNonNullSupplier
.java.util.Optional<T>
resolve()
Resolves the value of this LazyOptional, turning it into a standard non-lazyOptional
-
-
-
Field Detail
-
supplier
private final NonNullSupplier<T> supplier
-
lock
private final java.lang.Object lock
-
resolved
private org.apache.commons.lang3.mutable.Mutable<T> resolved
-
listeners
private java.util.Set<NonNullConsumer<LazyOptional<T>>> listeners
-
isValid
private boolean isValid
-
EMPTY
@Nonnull private static final LazyOptional<java.lang.Void> EMPTY
-
LOGGER
private static final org.apache.logging.log4j.Logger LOGGER
-
-
Constructor Detail
-
LazyOptional
private LazyOptional(@Nullable NonNullSupplier<T> instanceSupplier)
-
-
Method Detail
-
of
public static <T> LazyOptional<T> of(@Nullable NonNullSupplier<T> instanceSupplier)
Construct a newLazyOptional
that wraps the givenNonNullSupplier
.- Parameters:
instanceSupplier
- TheNonNullSupplier
to wrap. Cannot return null, but can be null itself. If null, this method returnsempty()
.
-
empty
public static <T> LazyOptional<T> empty()
- Returns:
- The singleton empty instance
-
cast
public <X> LazyOptional<X> cast()
This method hides an unchecked cast to the inferred type. Only use this if you are sure the type should match. For capabilities, generallyCapability.orEmpty(Capability, LazyOptional)
should be used.- Returns:
- This
LazyOptional
, cast to the inferred generic type
-
getValue
@Nullable private T getValue()
-
getValueUnsafe
private T getValueUnsafe()
-
isPresent
public boolean isPresent()
Check if thisLazyOptional
is non-empty.- Returns:
true
if thisLazyOptional
is non-empty, i.e. holds a non-null supplier
-
ifPresent
public void ifPresent(NonNullConsumer<? super T> consumer)
If non-empty, invoke the specifiedNonNullConsumer
with the object, otherwise do nothing.- Parameters:
consumer
- TheNonNullConsumer
to run if this optional is non-empty.- Throws:
java.lang.NullPointerException
- ifconsumer
is null and thisLazyOptional
is non-empty
-
lazyMap
public <U> LazyOptional<U> lazyMap(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptional
is non-empty, return a newLazyOptional
encapsulating the mapping function. Otherwise, returnsempty()
.The supplier inside this object is NOT resolved.
- Parameters:
mapper
- A mapping function to apply to the mod object, if present- Returns:
- A
LazyOptional
describing the result of applying a mapping function to the value of thisLazyOptional
, if a value is present, otherwise an emptyLazyOptional
- Throws:
java.lang.NullPointerException
- ifmapper
is null.
-
map
public <U> java.util.Optional<U> map(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptional
is non-empty, return a newOptional
encapsulating the mapped value. Otherwise, returnsOptional.empty()
.- Parameters:
mapper
- A mapping function to apply to the mod object, if present- Returns:
- An
Optional
describing the result of applying a mapping function to the value of thisOptional
, if a value is present, otherwise an emptyOptional
- Throws:
java.lang.NullPointerException
- ifmapper
is null.
-
filter
public java.util.Optional<T> filter(NonNullPredicate<? super T> predicate)
Resolve the contained supplier if non-empty, and filter it by the givenNonNullPredicate
, returning empty if false.It is important to note that this method is not lazy, as it must resolve the value of the supplier to validate it with the predicate.
- Parameters:
predicate
- ANonNullPredicate
to apply to the result of the contained supplier, if non-empty- Returns:
- An
Optional
containing the result of the contained supplier, if and only if the passedNonNullPredicate
returns true, otherwise an emptyOptional
- Throws:
java.lang.NullPointerException
- Ifpredicate
is null and thisOptional
is non-empty
-
resolve
public java.util.Optional<T> resolve()
Resolves the value of this LazyOptional, turning it into a standard non-lazyOptional
- Returns:
- The resolved optional.
-
orElse
public T orElse(T other)
Resolve the contained supplier if non-empty and return the result, otherwise returnother
.- Parameters:
other
- the value to be returned if thisLazyOptional
is empty- Returns:
- the result of the supplier, if non-empty, otherwise
other
-
orElseGet
public T orElseGet(NonNullSupplier<? extends T> other)
Resolve the contained supplier if non-empty and return the result, otherwise return the result ofother
.- Parameters:
other
- ANonNullSupplier
whose result is returned if thisLazyOptional
is empty- Returns:
- The result of the supplier, if non-empty, otherwise the result of
other.get()
- Throws:
java.lang.NullPointerException
- Ifother
is null and thisLazyOptional
is non-empty
-
orElseThrow
public <X extends java.lang.Throwable> T orElseThrow(NonNullSupplier<? extends X> exceptionSupplier) throws X extends java.lang.Throwable
Resolve the contained supplier if non-empty and return the result, otherwise throw the exception created by the providedNonNullSupplier
.- Type Parameters:
X
- Type of the exception to be thrown- Parameters:
exceptionSupplier
- TheNonNullSupplier
which will return the exception to be thrown- Returns:
- The result of the supplier
- Throws:
X
- If thisLazyOptional
is emptyjava.lang.NullPointerException
- IfexceptionSupplier
is null and thisLazyOptional
is emptyX extends java.lang.Throwable
-
addListener
public void addListener(NonNullConsumer<LazyOptional<T>> listener)
Register alistener
that will be called when thisLazyOptional
becomes invalid (viainvalidate()
).If this
LazyOptional
is empty, the listener will be called immediately.
-
invalidate
public void invalidate()
Invalidate thisLazyOptional
, making it unavailable for further use, and notifying anylisteners
that this has become invalid and they should update.This would typically be used with capability objects. For example, a TE would call this, if they are covered with a microblock panel, thus cutting off pipe connectivity to this side.
Also should be called for all when a TE is invalidated (for example, when the TE is removed or unloaded), or a world/chunk unloads, or a entity dies, etc... This allows modders to keep a cache of capability objects instead of re-checking them every tick.
-
-