Class ForgetfulMap<K,V>
- java.lang.Object
-
- java.util.AbstractMap<K,V>
-
- org.ojalgo.type.ForgetfulMap<K,V>
-
- All Implemented Interfaces:
java.util.Map<K,V>
public final class ForgetfulMap<K,V> extends java.util.AbstractMap<K,V>
AMap
that can forget entries after a specified period of time – a cache in other words. The entries can either expire after a certain amount of time has passed since they were created/written or since they were last accessed.In addition to implementing the
Map
interface, also looked at the Cache interface of the Caffeine library, and mimicked some of its methods.Furthermore, this class provides a re-implementation of
TypeCache
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
ForgetfulMap.Builder
private static class
ForgetfulMap.CachedValue<V>
Helper class to store value and timestampsstatic class
ForgetfulMap.ValueCache<K,V>
A re-implementation ofTypeCache
backed by aForgetfulMap
.
-
Field Summary
Fields Modifier and Type Field Description private static java.util.concurrent.ScheduledExecutorService
CLEANER
private long
myAccessLimit
private java.util.Map<K,ForgetfulMap.CachedValue<V>>
myStorage
private long
myWriteLimit
-
Constructor Summary
Constructors Constructor Description ForgetfulMap(ForgetfulMap.Builder builder)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description void
cleanUp()
Removes all entries that have expired.void
clear()
boolean
containsKey(java.lang.Object key)
boolean
containsValue(java.lang.Object value)
java.util.Set<java.util.Map.Entry<K,V>>
entrySet()
boolean
equals(java.lang.Object obj)
long
estimatedSize()
Returns the approximate number of entries in this cache.V
get(java.lang.Object key)
V
get(K key, java.util.function.Function<? super K,? extends V> mappingFunction)
Returns the value associated with thekey
in this cache, obtaining that value from themappingFunction
if necessary.java.util.Map<K,V>
getAllPresent(java.lang.Iterable<? extends K> keys)
Returns a map of the values associated with thekeys
in this cache.V
getIfPresent(K key)
Returns the value associated with thekey
in this cache, ornull
if there is no cached value for thekey
.int
hashCode()
void
invalidate(K key)
Discards any cached value for thekey
.void
invalidateAll()
Discards all entries in the cache.void
invalidateAll(java.lang.Iterable<? extends K> keys)
Discards any cached values for thekeys
.boolean
isEmpty()
private boolean
isExpired(long now, ForgetfulMap.CachedValue<V> cached)
java.util.Set<K>
keySet()
static ForgetfulMap.Builder
newBuilder()
ForgetfulMap.ValueCache<K,V>
newValueCache(K key, java.util.function.Function<? super K,? extends V> valueSupplier)
V
put(K key, V value)
void
putAll(java.util.Map<? extends K,? extends V> map)
Copies all of the mappings from the specified map to the cache.V
remove(java.lang.Object key)
boolean
remove(java.lang.Object key, java.lang.Object value)
int
size()
private java.util.Map.Entry<K,V>
unwrap(java.util.Map.Entry<K,ForgetfulMap.CachedValue<V>> entry)
-
-
-
Field Detail
-
CLEANER
private static final java.util.concurrent.ScheduledExecutorService CLEANER
-
myAccessLimit
private final long myAccessLimit
-
myStorage
private final java.util.Map<K,ForgetfulMap.CachedValue<V>> myStorage
-
myWriteLimit
private final long myWriteLimit
-
-
Constructor Detail
-
ForgetfulMap
ForgetfulMap(ForgetfulMap.Builder builder)
-
-
Method Detail
-
newBuilder
public static ForgetfulMap.Builder newBuilder()
-
cleanUp
public void cleanUp()
Removes all entries that have expired. This method is automatically called at regular intervals, but can also be called manually to remove entries that have expired since the last cleanup.
-
clear
public void clear()
-
containsKey
public boolean containsKey(java.lang.Object key)
-
containsValue
public boolean containsValue(java.lang.Object value)
-
equals
public boolean equals(java.lang.Object obj)
-
estimatedSize
public long estimatedSize()
Returns the approximate number of entries in this cache. The value returned is an estimate; the actual count may differ if there are concurrent insertions or removals, or if some entries are pending removal due to expiration or weak/soft reference collection. In the case of stale entries this inaccuracy can be mitigated by performing acleanUp()
first.
-
get
public V get(K key, java.util.function.Function<? super K,? extends V> mappingFunction)
Returns the value associated with thekey
in this cache, obtaining that value from themappingFunction
if necessary. This method provides a simple substitute for the conventional "if cached, return; otherwise create, cache and return" pattern.If the specified key is not already associated with a value, attempts to compute its value using the given mapping function and enters it into this cache unless
null
. The entire method invocation is performed atomically, so the function is applied at most once per key. Some attempted update operations on this cache by other threads may be blocked while the computation is in progress, so the computation should be short and simple, and must not attempt to update any other mappings of this cache.
-
get
public V get(java.lang.Object key)
-
getAllPresent
public java.util.Map<K,V> getAllPresent(java.lang.Iterable<? extends K> keys)
Returns a map of the values associated with thekeys
in this cache. The returned map will only contain entries which are already present in the cache.Note that duplicate elements in
keys
, as determined byObject.equals(java.lang.Object)
, will be ignored.
-
getIfPresent
public V getIfPresent(K key)
Returns the value associated with thekey
in this cache, ornull
if there is no cached value for thekey
.
-
hashCode
public int hashCode()
-
invalidate
public void invalidate(K key)
Discards any cached value for thekey
. The behavior of this operation is undefined for an entry that is being loaded (or reloaded) and is otherwise not present.
-
invalidateAll
public void invalidateAll()
Discards all entries in the cache. The behavior of this operation is undefined for an entry that is being loaded (or reloaded) and is otherwise not present.
-
invalidateAll
public void invalidateAll(java.lang.Iterable<? extends K> keys)
Discards any cached values for thekeys
. The behavior of this operation is undefined for an entry that is being loaded (or reloaded) and is otherwise not present.
-
isEmpty
public boolean isEmpty()
-
keySet
public java.util.Set<K> keySet()
-
newValueCache
public ForgetfulMap.ValueCache<K,V> newValueCache(K key, java.util.function.Function<? super K,? extends V> valueSupplier)
-
putAll
public void putAll(java.util.Map<? extends K,? extends V> map)
Copies all of the mappings from the specified map to the cache. The effect of this call is equivalent to that of callingput(k, v)
on this map once for each mapping from keyk
to valuev
in the specified map. The behavior of this operation is undefined if the specified map is modified while the operation is in progress.
-
remove
public V remove(java.lang.Object key)
-
remove
public boolean remove(java.lang.Object key, java.lang.Object value)
-
size
public int size()
-
isExpired
private boolean isExpired(long now, ForgetfulMap.CachedValue<V> cached)
-
unwrap
private java.util.Map.Entry<K,V> unwrap(java.util.Map.Entry<K,ForgetfulMap.CachedValue<V>> entry)
-
-