code: public static <T, E extends Exception> List<T> distinctBy(final Collection<? extends T> c, final Try.Function<? super T, ?, E> keyMapper) throws E {
          if (N.isNullOrEmpty(c)) {
              return new ArrayList<>();
          }
  
          return distinctBy(c, 0, c.size(), keyMapper);
      }
docs: Distinct by the value mapped from <code>keyMapper</code>.
  
  Mostly it's designed for one-step operation to complete the operation in one step.
  <code>java.util.stream.Stream</code> is preferred for multiple phases operation.
  
  @param c
  @param keyMapper don't change value of the input parameter.
  @return