Я пытаюсь понять, как работает функция Comparator.comparing
. Я создал свой собственный метод сравнения, чтобы понять его.
private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
BiFunction<T,T,Integer> bfun = (T a, T b) -> f.apply(a).compareTo(f.apply(b));
return (Comparator<T>) bfun;
}
Последняя строка в этой функции генерирует исключение.
Однако, если я изменю эту функцию на
private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
return (T a, T b) -> f.apply(a).compareTo(f.apply(b));
}
Он работает нормально, как и ожидалось.
Каков промежуточный функциональный интерфейс, который использует вторая попытка, которая может преобразовать лямбда в Comparator
?