Tôi đang cố gắng hiểu ý nghĩa của cách hoạt động của hàm Comparator.comparing
. Tôi đã tạo phương pháp so sánh của riêng mình để hiểu nó.Java Lambda để so sánh chuyển đổi - trình bày trung gian
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;
}
Dòng cuối cùng trong chức năng này sẽ ném ngoại lệ.
Tuy nhiên, nếu tôi thay đổi chức năng này để
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));
}
Nó hoạt động tốt như mong đợi.
Giao diện chức năng trung gian mà lần thử thứ hai sử dụng, có thể chuyển đổi lambda thành Comparator
là gì?
Loại lambda chuyển thành là loại biểu thức phải từ ngữ cảnh của nó. Trong ví dụ đầu tiên lambda phải chuyển đổi thành 'BiFunction' vì đó là kiểu biến mà nó gán cho nó. Trong ví dụ thứ hai, lambda phải chuyển đổi thành một 'Comparator' vì đó là kiểu trả về của phương thức. 'BiFunction' và' Comparator' có cùng một "hình dạng", do đó, lambda giống nhau có thể trở thành tùy thuộc vào ngữ cảnh, nhưng chúng là các kiểu khác nhau để đúc một cái khác sẽ thất bại. –
Tôi đang downvoting cái này. Không phải vì chất lượng, nhưng vì có một số kiểm toán về câu hỏi này, trong đó * ba * không thành công. –