ใช้ทั้ง Java 8 และ Java 11 ให้พิจารณาสิ่งต่อไปนี้TreeSet
กับตัวString::compareToIgnoreCase
เปรียบเทียบ:
final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");
System.out.println(languages); // [c++, java, python]
เมื่อฉันพยายามที่จะลบองค์ประกอบที่แน่นอนที่มีอยู่ในTreeSet
มันทำงาน: ทั้งหมดที่ระบุจะถูกลบออก:
languages.removeAll(Arrays.asList("PYTHON", "C++"));
System.out.println(languages); // [java]
แต่ถ้าฉันพยายามที่จะเอาแทนมากขึ้นกว่าที่มีอยู่ในTreeSet
โทรไม่เอาอะไรเลย (นี้ไม่โทรตามมา แต่เรียกแทนของตัวอย่างด้านบน):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages); // [c++, java, python]
ผมทำอะไรผิดหรือเปล่า? ทำไมมันทำเช่นนี้?
แก้ไข: String::compareToIgnoreCase
เป็นตัวเปรียบเทียบที่ถูกต้อง:
(l, r) -> l.compareToIgnoreCase(r)