code: static List<Object> retainMatchingToString(Iterable<?> items, Iterable<?> itemsToCheck) {
      SetMultimap<String, Object> stringValueToItemsToCheck = HashMultimap.create();
      for (Object itemToCheck : itemsToCheck) {
        stringValueToItemsToCheck.put(String.valueOf(itemToCheck), itemToCheck);
      }
  
      List<Object> result = Lists.newArrayList();
      for (Object item : items) {
        for (Object itemToCheck : stringValueToItemsToCheck.get(String.valueOf(item))) {
          if (!Objects.equal(itemToCheck, item)) {
            result.add(item);
            break;
          }
        }
      }
      return result;
    }
docs: Returns a new collection containing all elements in {@code items} for which there exists at
  least one element in {@code itemsToCheck} that has the same {@code toString()} value without
  being equal.
  
  <p>Example: {@code retainMatchingToString([1L, 2L, 2L], [2, 3]) == [2L, 2L]}