code: private V replaceNoCopyOrAwait(K key, V value) {
      requireNonNull(value);
      V copy = copyOf(value);
      @SuppressWarnings("unchecked")
      V[] replaced = (V[]) new Object[1];
      cache.asMap().computeIfPresent(key, (k, expirable) -> {
        if (!expirable.isEternal() && expirable.hasExpired(currentTimeMillis())) {
          dispatcher.publishExpired(this, key, expirable.get());
          statistics.recordEvictions(1L);
          return null;
        }
  
        publishToCacheWriter(writer::write, () -> new EntryProxy<>(key, value));
        long expireTimeMS = getWriteExpireTimeMS(/* created */ false);
        if (expireTimeMS == Long.MIN_VALUE) {
          expireTimeMS = expirable.getExpireTimeMS();
        }
        dispatcher.publishUpdated(this, key, expirable.get(), copy);
        replaced[0] = expirable.get();
        return new Expirable<>(copy, expireTimeMS);
      });
      return replaced[0];
    }
docs: Replaces the entry for the specified key only if it is currently mapped to some value. The
  entry is not store-by-value copied nor does the method wait for synchronous listeners to
  complete.
  
  @param key key with which the specified value is associated
  @param value value to be associated with the specified key
  @return the old value