2015-09-05 30 views
9

Làm cách nào để Java biết được tham chiếu phương thức String::compareTo nào để sử dụng khi gọi Collections.sort(someListOfStrings, String::compareTo);? compareTo không tĩnh và cần biết số value của "bên trái" của so sánh.Làm thế nào để Java 8 biết tham chiếu phương thức String :: compareTo nào để sử dụng khi sắp xếp?

+0

Điều này là gì? String :: compareTo' –

+0

Câu hỏi của bạn không rõ ràng: 'Collections.sort' sắp xếp các mục của một bộ sưu tập,' String :: compareTo' được sử dụng để so sánh hai chuỗi trong bộ sưu tập đó. nếu chuỗi a alfasin

Trả lời

11

Giả sử rằng bạn sử dụng phương pháp tham khảo cho Comparator giao diện:

Comparator<String> cmp = String::compareTo; 

Khi bạn gọi cmp.compare(left, right) (đó là "phương pháp trừu tượng đơn lẻ" hoặc "SAM" của giao diện Comparator), sự kỳ diệu xảy ra:

int result = cmp.compare(left, right); 
          |  | 
    /------------------------/  | 
    |    /---------------/ 
    |    | 
left.compareTo(right); 

Về cơ bản tất cả các tham số của SAM được chuyển đổi thành tham số của phương thức được gọi, nhưng đối tượng this (ở bên trái) cũng được tính là tham số.

+7

Đây được gọi là tham chiếu phương pháp * không ràng buộc *. –

+0

@Tagir Valeev nhưng kiểu 'String :: compareTo' khớp với' Comparator 'như thế nào? Chữ ký kiểu không khớp ... Phương thức 'compareTo' của' String' là 'public int compareTo (String anotherString)', 'Comparator ' là 'int so sánh (String o1, String o2);' Tôi biết tôi 'm thiếu một cái gì đó tôi không thể khá kết nối các dấu chấm. – stantonk

+2

@stantonk, hãy suy nghĩ về 'this' này về một tham số nữa, vì vậy' public int compareTo (String anotherString) 'giống như' public static int compareTo (String this, String anotherString) '. Nói chung trong OOP-ngôn ngữ bên trong nó hoạt động như thế này: con trỏ đối tượng (tham chiếu) được chuyển đổi thành tham số đầu tiên của hàm/phương thức. –

0

OK, nguồn gốc của Collections.sort() trông như sau:

public static <T> void sort(List<T> list, Comparator<? super T> c) { 
    Object[] a = list.toArray(); 
    Arrays.sort(a, (Comparator)c); 
    ListIterator i = list.listIterator(); 
    for (int j=0; j<a.length; j++) { 
     i.next(); 
     i.set(a[j]); 
    } 
} 

Tôi nghĩ rằng đó là khá rõ ràng bây giờ. Nội dung là một danh sách. Nó có nghĩa là nó có một trật tự và các mặt hàng được xử lý từng cái một theo thứ tự đó.

+0

xin lỗi, điều đó không trả lời được câu hỏi của tôi. Những gì tôi đang cố gắng để hiểu là làm thế nào Java biết sử dụng chính xác 'String :: compareTo' phương pháp tham khảo cho mỗi yếu tố trong danh sách được sắp xếp. Ví dụ: – stantonk

+0

, giả sử bạn có danh sách '[" c "," b "," a "]'. phần tử đầu tiên trong danh sách đó, "c", là một thể hiện của lớp 'String', có một thuộc tính' giá trị' là một mảng ký tự chứa một ký tự đơn, 'c'. 'compareTo' so sánh giữa" c "và" b "sâu bên trong phương thức' Collections.sort', tức là 'if (c.compare (a [runHi ++], a [lo]) <0)'. Tôi không thấy cách tham chiếu phương thức đưa bạn từ 'Comparable' đến' Comparator'. – stantonk

Các vấn đề liên quan