code: @NotNull
      public static <T, U> ComparatorCompat<T> comparing(
              @NotNull final Function<? super T, ? extends U> keyExtractor,
              @NotNull final Comparator<? super U> keyComparator) {
          Objects.requireNonNull(keyExtractor);
          Objects.requireNonNull(keyComparator);
          return new ComparatorCompat<T>(new Comparator<T>() {
  
              @Override
              public int compare(T t1, T t2) {
                  final U u1 = keyExtractor.apply(t1);
                  final U u2 = keyExtractor.apply(t2);
                  return keyComparator.compare(u1, u2);
              }
          });
      }
docs: Returns a comparator that uses a function that extracts a sort key
  to be compared with the specified comparator.
  
  @param <T> the type of the objects compared by the comparator
  @param <U> the type of the sort key
  @param keyExtractor  the function that extracts the sort key
  @param keyComparator  the comparator used to compare the sort key
  @return a comparator
  @throws NullPointerException if {@code keyExtractor} or {@code keyComparator} is null