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?
Trả lời
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ố.
Đây được gọi là tham chiếu phương pháp * không ràng buộc *. –
@Tagir Valeev nhưng kiểu 'String :: compareTo' khớp với' Comparator
@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. –
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ự đó.
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
, 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
- 1. phương thức compareTo java
- 2. Làm cách nào để tham chiếu biểu thức lambda Java?
- 3. Làm thế nào để tham chiếu hàm tạo của mảng Java 8 hoạt động?
- 4. Làm cách nào để sử dụng tham chiếu phương thức trên một lần nhập tĩnh?
- 5. Tham chiếu phương thức Java 8 và các phương thức ghi đè
- 6. Gọi toString qua tham chiếu phương thức trong Java 8
- 7. Có thể sử dụng tham chiếu phương thức kiểu Java 8 trong Scala không?
- 8. Làm cách nào để sử dụng phản chiếu để gọi phương thức có tham số?
- 9. Làm thế nào để buộc SBT sử dụng Java 8?
- 10. Cách ngắn gọn để soạn tham chiếu phương thức Java?
- 11. Làm thế nào để Loop và In 2D mảng sử dụng Java 8
- 12. Làm cách nào để biết tôi đang sử dụng phương thức lặp nào khi sử dụng phương pháp Integer.times?
- 13. Tham số bị mất của Java 8 khi sử dụng ::
- 14. Làm thế nào để sử dụng phương pháp Java 8 `Files.find`?
- 15. Làm thế nào để sử dụng phương thức Skin.AddPageMessage()?
- 16. Làm thế nào để sắp xếp bảng sử dụng chức năng/phương trình chỉ
- 17. Làm thế nào để bạn thực hiện các phương thức compareTo một cách rõ ràng?
- 18. Làm thế nào để cho phép SortArrayUsingSelector sử dụng số nguyên để sắp xếp thay cho String?
- 19. Java nhận String CompareTo như một đối tượng so sánh
- 20. Phương thức tham chiếu phương thức đến các hàm tạo lớp địa phương trong Java 8 hoạt động như thế nào?
- 21. Khi nào và cách sử dụng vector tham chiếu
- 22. Java không có autoboxing cho int cho phương thức compareTo?
- 23. Android/Java: Gọi phương thức sử dụng phản chiếu?
- 24. Sử dụng API Java 8 luồng, có thể sắp xếp() được dựa vào khi gọi Collectors.toSet()?
- 25. Làm thế nào để thêm phương thức sử dụng metaclass
- 26. Làm thế nào để chuyển đổi Blob để String và String để Blob trong java
- 27. Làm thế nào để sử dụng Collections.sort() trong Java? (Tình hình cụ thể)
- 28. Làm cách nào để sắp xếp lại các phương thức được tạo tự động trong Netbeans?
- 29. Sắp xếp mảng Java UTF-8
- 30. Mô hình phương thức nhà máy trong java sử dụng Generics, làm thế nào để?
Điều này là gì? String :: compareTo' –
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