tôi đang tìm kiếm thông qua mã nguồn Java cho giao diện Map
và chạy vào đoạn này ít mã:Java biểu thức lambda, đúc, và comparators
/**
* Returns a comparator that compares {@link Map.Entry} in natural order on value.
*
* <p>The returned comparator is serializable and throws {@link
* NullPointerException} when comparing an entry with null values.
*
* @param <K> the type of the map keys
* @param <V> the {@link Comparable} type of the map values
* @return a comparator that compares {@link Map.Entry} in natural order on value.
* @see Comparable
* @since 1.8
*/
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
Từ khai báo phương thức tôi nhận được rằng đây là một phương pháp chung trả về một Trình so sánh của một kiểu được suy ra từ các mục nhập bản đồ được truyền vào nó hoặc được cung cấp một cách rõ ràng trong phương thức.
Điều thực sự khiến tôi tắt là giá trị trả lại. Có vẻ như biểu thức lambda
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
được truyền rõ ràng tới Comparator<Map.Entry<K, V>>
. Thê nay đung không?
Tôi cũng nhận thấy rằng dàn diễn viên rõ ràng bao gồm & Serializable
. Tôi chưa từng thấy một giao diện kết hợp với một lớp trong một dàn diễn viên trước đây, nhưng có vẻ như các giá trị sau đây trong trình biên dịch:
((SubClass & AnInterface) anObject).interfaceMethod();
Mặc dù đây không làm việc:
public class Foo {
public static void main(String[] args) {
Object o = new Foo() {
public void bar() {
System.out.println("nope");
}
};
((Foo & Bar) o).bar();
}
}
interface Bar {
public void bar();
}
Vì vậy, hai câu hỏi:
Làm cách nào để thêm giao diện vào dàn diễn viên phải hoạt động? Điều này chỉ thực thi kiểu trả về của một phương thức của giao diện?
Bạn có thể truyền một biểu thức Lambda lên
Comparator
không? Những gì khác họ có thể được đúc như? Hay là một biểu thức lambda về cơ bản chỉ là mộtComparator
? Ai đó có thể làm rõ tất cả điều này?
Một lambda có thể được truyền tới bất kỳ giao diện nào bằng một phương thức trừu tượng duy nhất có chữ ký khớp với phần thân của lambda. –
Aargh, 'Seralizable'! – fge
http://www.java2s.com/Tutorials/Java/Java_Lambda/0080__Java_Intersection_Type.htm –