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>EMPTYprivate booleanisValidprivate java.util.Set<NonNullConsumer<LazyOptional<T>>>listenersprivate java.lang.Objectlockprivate static org.apache.logging.log4j.LoggerLOGGERprivate org.apache.commons.lang3.mutable.Mutable<T>resolvedprivate NonNullSupplier<T>supplier
-
Constructor Summary
Constructors Modifier Constructor Description privateLazyOptional(NonNullSupplier<T> instanceSupplier)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddListener(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 TgetValue()private TgetValueUnsafe()voidifPresent(NonNullConsumer<? super T> consumer)If non-empty, invoke the specifiedNonNullConsumerwith the object, otherwise do nothing.voidinvalidate()Invalidate thisLazyOptional, making it unavailable for further use, and notifying anylistenersthat this has become invalid and they should update.booleanisPresent()Check if thisLazyOptionalis non-empty.<U> LazyOptional<U>lazyMap(NonNullFunction<? super T,? extends U> mapper)If a thisLazyOptionalis non-empty, return a newLazyOptionalencapsulating the mapping function.<U> java.util.Optional<U>map(NonNullFunction<? super T,? extends U> mapper)If a thisLazyOptionalis non-empty, return a newOptionalencapsulating the mapped value.static <T> LazyOptional<T>of(NonNullSupplier<T> instanceSupplier)Construct a newLazyOptionalthat wraps the givenNonNullSupplier.TorElse(T other)Resolve the contained supplier if non-empty and return the result, otherwise returnother.TorElseGet(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 newLazyOptionalthat wraps the givenNonNullSupplier.- Parameters:
instanceSupplier- TheNonNullSupplierto 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 thisLazyOptionalis non-empty.- Returns:
trueif thisLazyOptionalis non-empty, i.e. holds a non-null supplier
-
ifPresent
public void ifPresent(NonNullConsumer<? super T> consumer)
If non-empty, invoke the specifiedNonNullConsumerwith the object, otherwise do nothing.- Parameters:
consumer- TheNonNullConsumerto run if this optional is non-empty.- Throws:
java.lang.NullPointerException- ifconsumeris null and thisLazyOptionalis non-empty
-
lazyMap
public <U> LazyOptional<U> lazyMap(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptionalis non-empty, return a newLazyOptionalencapsulating 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
LazyOptionaldescribing the result of applying a mapping function to the value of thisLazyOptional, if a value is present, otherwise an emptyLazyOptional - Throws:
java.lang.NullPointerException- ifmapperis null.
-
map
public <U> java.util.Optional<U> map(NonNullFunction<? super T,? extends U> mapper)
If a thisLazyOptionalis non-empty, return a newOptionalencapsulating the mapped value. Otherwise, returnsOptional.empty().- Parameters:
mapper- A mapping function to apply to the mod object, if present- Returns:
- An
Optionaldescribing the result of applying a mapping function to the value of thisOptional, if a value is present, otherwise an emptyOptional - Throws:
java.lang.NullPointerException- ifmapperis 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- ANonNullPredicateto apply to the result of the contained supplier, if non-empty- Returns:
- An
Optionalcontaining the result of the contained supplier, if and only if the passedNonNullPredicatereturns true, otherwise an emptyOptional - Throws:
java.lang.NullPointerException- Ifpredicateis null and thisOptionalis 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 thisLazyOptionalis 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- ANonNullSupplierwhose result is returned if thisLazyOptionalis empty- Returns:
- The result of the supplier, if non-empty, otherwise the result of
other.get() - Throws:
java.lang.NullPointerException- Ifotheris null and thisLazyOptionalis 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- TheNonNullSupplierwhich will return the exception to be thrown- Returns:
- The result of the supplier
- Throws:
X- If thisLazyOptionalis emptyjava.lang.NullPointerException- IfexceptionSupplieris null and thisLazyOptionalis emptyX extends java.lang.Throwable
-
addListener
public void addListener(NonNullConsumer<LazyOptional<T>> listener)
Register alistenerthat will be called when thisLazyOptionalbecomes invalid (viainvalidate()).If this
LazyOptionalis empty, the listener will be called immediately.
-
invalidate
public void invalidate()
Invalidate thisLazyOptional, making it unavailable for further use, and notifying anylistenersthat 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.
-
-