code: public static <K, V> MapDifference<K, V> difference(
        Map<? extends K, ? extends V> left,
        Map<? extends K, ? extends V> right,
        Equivalence<? super V> valueEquivalence) {
      Preconditions.checkNotNull(valueEquivalence);
  
      Map<K, V> onlyOnLeft = newLinkedHashMap();
      Map<K, V> onlyOnRight = new LinkedHashMap<K, V>(right); // will whittle it down
      Map<K, V> onBoth = newLinkedHashMap();
      Map<K, MapDifference.ValueDifference<V>> differences = newLinkedHashMap();
      doDifference(left, right, valueEquivalence, onlyOnLeft, onlyOnRight, onBoth, differences);
      return new MapDifferenceImpl<K, V>(onlyOnLeft, onlyOnRight, onBoth, differences);
    }
docs: Computes the difference between two maps. This difference is an immutable
  snapshot of the state of the maps at the time this method is called. It
  will never change, even if the maps change at a later time.
  
  <p>Values are compared using a provided equivalence, in the case of
  equality, the value on the 'left' is returned in the difference.
  
  <p>Since this method uses {@code HashMap} instances internally, the keys of
  the supplied maps must be well-behaved with respect to
  {@link Object#equals} and {@link Object#hashCode}.
  
  @param left the map to treat as the "left" map for purposes of comparison
  @param right the map to treat as the "right" map for purposes of comparison
  @param valueEquivalence the equivalence relationship to use to compare
  values
  @return the difference between the two maps
  @since 10.0