Sử dụng cả Java 8 và Java 11, hãy xem xét các điều sau TreeSet
với bộ String::compareToIgnoreCase
so 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 TreeSet
cuộ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::compareToIgnoreCase
là một so sánh hợp lệ:
(l, r) -> l.compareToIgnoreCase(r)