cache

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java b/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
index 89869c6..78fadb0 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/cache/Caffeine.java
@@ -6,8 +6,11 @@
 package br.ufrgs.inf.prosoft.cache;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 
 /**
@@ -104,6 +107,37 @@ public class Caffeine<K, V> implements Cache<K, V> {
         registerEvent(EventType.INVALIDATION, null);
     }
 
+    public boolean containsKey(K key) {
+        Optional<V> get = this.cache.getIfPresent(Optional.ofNullable(key));
+        return get != null;
+    }
+
+    public Set<Map.Entry<K, V>> entrySet() {
+        Set<Map.Entry<K, V>> entrySet = this.cache.asMap().entrySet().stream().collect(
+                Collectors.toMap(entry -> entry.getKey().orElse(null), entry -> entry.getValue().orElse(null)))
+                .entrySet();
+        if (CACHE_EVALUATE_PERFORMANCE) {
+            entrySet.forEach(entry -> {
+                registerEvent(EventType.HIT, entry.getValue());
+            });
+        }
+        return entrySet;
+    }
+
+    public void forEach(BiConsumer<K, V> consumer) {
+        entrySet().forEach(entry -> {
+            consumer.accept(entry.getKey(), entry.getValue());
+        });
+    }
+
+    public int size() {
+        return values().size();
+    }
+
+    public boolean isEmpty() {
+        return values().isEmpty();
+    }
+
     private String getIdentifier(Object object) {
         return object != null ? String.valueOf(object.hashCode()) : "null";
     }