code: @SuppressWarnings("unchecked")
    public <T extends VALUE> T withCachePut(KEY key, Supplier<VALUE> cacheableOperation) {
  
      Assert.notNull(key, "Key is required");
      Assert.notNull(cacheableOperation, "Supplier is required");
  
      return (T) Optional.ofNullable(cacheableOperation.get())
        .map(value -> write(getLock(), key, value))
        .orElse(null);
    }
docs: This caching data access operation invokes the supplied {@link Supplier cacheable operation} and then caches
  the {@link VALUE result} before returning the computed {@link VALUE}.
  
  The {@link VALUE result} of the {@link Supplier cacheable operation} is only cached if the {@link VALUE result}
  is not {@literal null}.
  
  @param <T> {@link Class type} of the return {@link VALUE value}.
  @param key {@link KEY key} mapping the {@link VALUE value} returned by the {@link Supplier cacheable operation}
  as an entry stored in the {@link Cache}.
  @param cacheableOperation {@link Supplier} used to compute or load a {@link VALUE value}
  mapped to the given {@link KEY key} and put as an entry in the {@link Cache}.
  @return the {@link VALUE result} of the {@link Supplier cacheable operation}.
  @throws IllegalArgumentException if either the {@link KEY key} or the {@link Supplier} are {@literal null}.
  @see java.util.function.Supplier
  @see #getCache()
  @see #getLock()