Sử dụng cả Java 8 và Java 11, hãy xem xét các điều sau TreeSetvới bộ String::compareToIgnoreCaseso sánh:
final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");
System.out.println(languages); // [c++, java, python]
Khi tôi cố gắng loại bỏ các yếu tố chính xác có trong TreeSet, nó hoạt động: tất cả những yếu tố được chỉ định đều bị xóa:
languages.removeAll(Arrays.asList("PYTHON", "C++"));
System.out.println(languages); // [java]
Tuy nhiên, nếu tôi cố gắng loại bỏ thay vì nhiều hơn hiện diện trong TreeSetcuộc gọi, cuộc gọi sẽ không xóa bất cứ điều gì cả (đây không phải là cuộc gọi tiếp theo mà được gọi thay vì đoạn trích ở trên):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages); // [c++, java, python]
Tôi đang làm gì sai? Tại sao nó hành xử theo cách này?
Chỉnh sửa: String::compareToIgnoreCaselà một so sánh hợp lệ:
(l, r) -> l.compareToIgnoreCase(r)