Próbuję zrozumieć, jak działa funkcja Comparator.comparing
. Stworzyłem własną metodę porównywania, aby ją zrozumieć.Java Lambda do konwersji komparatora - reprezentacja pośrednia
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;
}
Ostatni wiersz w tej funkcji zgłasza wyjątek.
Jeśli jednak zmienić tę funkcję do
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));
}
To działa tak samo dobrze, jak oczekiwano.
Jaki jest pośredni interfejs funkcjonalny, którego używa druga próba, który jest w stanie przekonwertować lambda na Comparator
?
Typ, do którego konwertuje lambda, to typ, z którego wyrażenie musi pochodzić z kontekstu. W pierwszym przykładzie lambda musi przekształcić się w 'BiFunction', ponieważ jest to typ zmiennej, do której jest przypisany. W drugim przykładzie lambda musi konwertować na "Komparator", ponieważ jest to typ zwracany przez metodę. 'BiFunction' i' Comparator' mają ten sam "kształt", więc ta sama lambda może stać się zależna od kontekstu, ale są to różne typy, więc rzucanie jeden do drugiego zawiedzie. –
I'm downvoting this. Nie dla jakości, ale dlatego, że w tym pytaniu przeprowadzono szereg audytów, z których * trzy * nie powiodło się. –