Tôi cố gắng để sắp xếp List
của người lao động theo tên thì tuổi sử dụng Java8 Comparator
, tôi đã tạo ra bên dưới Comparator
nhưng nó mang lại cho tôi một lỗi biên dịchso sánh và thenComparing cho biên dịch lỗi
Type mismatch: cannot convert from Comparator<Object> to <unknown>
Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error
nhưng nó hoạt động nếu tôi chỉ định rõ ràng Loại
Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works
hoặc bằng cách tạo ra hai Compartor
s và chuỗi
Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
Comparator<String> cc = name.thenComparing(age); //works
tôi đã xác định loại Comparator<String>
ở phía bên trái nhưng tại sao loại tự động suy luận không tìm đúng loại, phấn đấu để xác định rõ ràng.
Ai đó có thể làm rõ điều này?
Đây là mã
String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
List<String> sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList());
System.out.println(sorted);
đầu ra
[alan 19, alan 25, mario 25, mario 30]
Tôi không phải là chuyên gia về suy luận kiểu chung, nhưng tôi đoán đây chỉ là "quá nhiều suy luận tự động". Có lẽ, nó không thể tìm ra loại phương thức 'compare()' vì nó không có bất kỳ kiểu nào để "neo" nó, không giống như phương thức chuỗi nơi bạn đưa ra một kiểu cho kết quả của 'so sánh (một cách rõ ràng)) '. Bất kể, tôi nghĩ rằng nó sẽ dễ đọc hơn khi viết 'Comparator' của riêng bạn, và chỉ gọi là 'split' một lần. Không có giải thưởng cho việc ép mã vào các dòng ít nhất có thể. – ajb
Nhập mục tiêu không hoạt động thông qua các lời gọi phương thức xích, xem [tại đây] (http://stackoverflow.com/a/28834656/2711488) và [tại đây] (http://stackoverflow.com/a/26883991/2711488) và [ở đây] (http://stackoverflow.com/a/31383947/2711488). Tuy nhiên, bạn chỉ có thể sử dụng 'Comparator.comparing (s -> s.replaceFirst (" \\ s + "," "))' thay vì so sánh hai giai đoạn của bạn và kết quả sẽ giống nhau ... – Holger
'Comparator.comparing ((Chuỗi s) -> s.split ("\\ s +") [0]) .soComparingInt (s -> Integer.parseInt (s.split ("\\ s +") [1])) 'hoạt động nhưng tại sao' String' này là bắt buộc, nó có thể suy ra từ 'Comparator', nó là một hạn chế trong suy luận kiểu? BTW sử dụng 'phiên bản java" 1.8.0_60 "' –
Saravana