public static <A, B, V> KeyTransformingLoadingCache<A, B, V> from(LoadingCache<B, V> delegate, Function<A, B> keyTransformer) { return new KeyTransformingLoadingCache<A, B, V>(delegate, keyTransformer); }
@Override public V get(A key, Callable<? extends V> valueLoader) throws ExecutionException { return delegate().get(keyTransformer().apply(key), valueLoader); }
@Override public void invalidateAll() { delegate().invalidateAll(); }
stringDoubler = KeyTransformingLoadingCache.from(doublingCache, new Function<String, Integer>(){ @Override
@Override public CacheStats stats() { return delegate().stats(); }
@Test public void testSubsetOfMapKeys() { final Set<String> validKeys = ImmutableSet.of("a", "b", "c"); LoadingCache<Map<String, Integer>, Map<Integer, String>> keySubset = KeyTransformingLoadingCache.from(keyValueSwapCache, new Function<Map<String, Integer>, Map<String, Integer>>() { @Override public Map<String, Integer> apply(Map<String, Integer> input) { Map<String, Integer> replacement = Maps.newHashMap(input); replacement.keySet().retainAll(validKeys); return replacement; } }); Map<Integer, String> output = keySubset.getUnchecked(ImmutableMap.of("a", 1, "b", 2, "d", 4)); assertEquals(output, ImmutableMap.of(1, "a", 2, "b")); assertEquals(keySubset.size(), 1, "Expected cache to contain one value"); assertEquals(keySubset.stats().loadCount(), 1, "Expected cache to have loaded one value"); // Check input with different key reducing to same map gives same output Map<Integer, String> output2 = keySubset.getUnchecked(ImmutableMap.of("a", 1, "b", 2, "z", 26)); assertEquals(output2, output); assertEquals(keySubset.size(), 1, "Expected cache to contain one value"); assertEquals(keySubset.stats().loadCount(), 1, "Expected cache to have loaded one value"); // And keySubset.getUnchecked(ImmutableMap.of("c", 3)); assertEquals(keySubset.size(), 2, "Expected cache to contain two values"); assertEquals(keySubset.stats().loadCount(), 2, "Expected cache to have loaded a second value"); }
@Override public void invalidate(Object key) { try { @SuppressWarnings("unchecked") A cast = (A) key; delegate().invalidate(keyTransformer().apply(cast)); } catch (ClassCastException e) { // Ignore } }
@Override public long size() { return delegate().size(); }
@Override public V get(A key) throws ExecutionException { return delegate().get(keyTransformer().apply(key)); }
@Override public void cleanUp() { delegate().cleanUp(); }
@Override public V getIfPresent(Object key) { try { @SuppressWarnings("unchecked") A cast = (A) key; return delegate().getIfPresent(keyTransformer().apply(cast)); } catch (ClassCastException e) { return null; } }
@Override public void put(A key, V value) { delegate().put(keyTransformer().apply(key), value); }
@Override public void refresh(A key) { delegate().refresh(keyTransformer().apply(key)); }