ProjectAres/Util/core/src/main/java/tc/oc/commons/core/util/CacheUtils.java

46 lines
1.5 KiB
Java

package tc.oc.commons.core.util;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;
import com.google.common.base.Throwables;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public interface CacheUtils {
static <K, V> CacheBuilder<K, V> newBuilder() {
return (CacheBuilder<K, V>) CacheBuilder.newBuilder();
}
static <K, V, E extends Exception> LoadingCache<K, V> newCache(CacheBuilder<K, V> builder, ThrowingFunction<K, V, E> loader) {
return builder.build(new CacheLoader<K, V>() {
@Override
public V load(K key) throws E {
return loader.applyThrows(key);
}
});
}
static <K, V, E extends Exception> LoadingCache<K, V> newCache(ThrowingFunction<K, V, E> loader) {
return newCache(newBuilder(), loader);
}
static <K, V> Cache<K, V> newCache() {
return newBuilder().build();
}
static <K, V, E extends Exception> LoadingCache<K, V> newWeakKeyCache(ThrowingFunction<K, V, E> loader) {
return newCache((CacheBuilder<K, V>) newBuilder().weakKeys(), loader);
}
static <K, V> V getUnchecked(Cache<K, V> cache, K key, Supplier<V> supplier) {
try {
return cache.get(key, supplier::get);
} catch(ExecutionException e) {
throw Throwables.propagate(e);
}
}
}