docs: @Override
    public Iterator<Entry<K,V>> iterator() {
      checkClosed();
      final Iterator<K> _keyIterator = cache.keys().iterator();
      return new Iterator<Entry<K, V>>() {
  
        CacheEntry<K, V> entry;
  
        @Override
        public boolean hasNext() {
          while(_keyIterator.hasNext()) {
            entry = cache.getEntry(_keyIterator.next());
            if (entry.getException() == null) {
              return true;
            }
          }
          entry = null;
          return false;
        }
  
        @Override
        public Entry<K, V> next() {
          if (entry == null && !hasNext()) {
            throw new NoSuchElementException();
          }
          return new Entry<K, V>() {
            @Override
            public K getKey() {
              return entry.getKey();
            }
  
            @Override
            public V getValue() {
              return entry.getValue();
            }
  
            @SuppressWarnings("unchecked")
            @Override
            public <T> T unwrap(Class<T> _class) {
              if (CacheEntry.class.equals(_class)) {
                return (T) entry;
              }
              return null;
            }
          };
        }
  
        @Override
        public void remove() {
          if (entry == null) {
            throw new IllegalStateException("hasNext() / next() not called or end of iteration reached");
          }
          cache.remove(entry.getKey());
        }
      };
    }