merge pull/2120

This commit is contained in:
agapple
2020-02-28 12:29:41 +08:00
parent 92f04f86cb
commit 18418ebd98
4 changed files with 129 additions and 12 deletions
@@ -1,19 +1,134 @@
package com.google.common.collect;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import com.google.common.base.Function;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class MigrateMap {
@SuppressWarnings("deprecation")
public static <K, V> ConcurrentMap<K, V> makeComputingMap(MapMaker maker,
public static <K, V> ConcurrentMap<K, V> makeComputingMap(CacheBuilder<Object, Object> builder,
Function<? super K, ? extends V> computingFunction) {
return maker.makeComputingMap(computingFunction);
final Function<? super K, ? extends V> function = computingFunction;
LoadingCache<K, V> computingCache = builder.build(new CacheLoader<K, V>() {
@Override
public V load(K key) throws Exception {
return function.apply(key);
}
});
return new MigrateConcurrentMap<K, V>(computingCache);
}
@SuppressWarnings("deprecation")
public static <K, V> ConcurrentMap<K, V> makeComputingMap(Function<? super K, ? extends V> computingFunction) {
return new MapMaker().makeComputingMap(computingFunction);
return makeComputingMap(CacheBuilder.newBuilder(), computingFunction);
}
final static class MigrateConcurrentMap<K, V> implements ConcurrentMap<K, V> {
private final LoadingCache<K, V> computingCache;
private final ConcurrentMap<K, V> cacheView;
MigrateConcurrentMap(LoadingCache<K, V> computingCache){
this.computingCache = computingCache;
this.cacheView = computingCache.asMap();
}
@Override
public int size() {
return cacheView.size();
}
@Override
public boolean isEmpty() {
return cacheView.isEmpty();
}
@Override
public boolean containsKey(Object key) {
return cacheView.containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return cacheView.containsValue(value);
}
@Override
public V get(Object key) {
try {
return computingCache.get((K) key);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
@Override
public V put(K key, V value) {
return cacheView.put(key, value);
}
@Override
public V remove(Object key) {
return cacheView.remove(key);
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
cacheView.putAll(m);
}
@Override
public void clear() {
cacheView.clear();
}
@Override
public Set<K> keySet() {
return cacheView.keySet();
}
@Override
public Collection<V> values() {
return cacheView.values();
}
@Override
public Set<Entry<K, V>> entrySet() {
return cacheView.entrySet();
}
@Override
public V putIfAbsent(K key, V value) {
return cacheView.putIfAbsent(key, value);
}
@Override
public boolean remove(Object key, Object value) {
return cacheView.remove(key, value);
}
@Override
public boolean replace(K key, V oldValue, V newValue) {
return cacheView.replace(key, oldValue, newValue);
}
@Override
public V replace(K key, V value) {
return cacheView.replace(key, value);
}
@Override
public String toString() {
return cacheView.toString();
}
}
}