Usando Java 8 y Java 11, considere lo siguiente TreeSetcon un String::compareToIgnoreCasecomparador:
final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");
System.out.println(languages); // [c++, java, python]
Cuando intento eliminar los elementos exactos presentes en el TreeSet, funciona: se eliminan todos los especificados:
languages.removeAll(Arrays.asList("PYTHON", "C++"));
System.out.println(languages); // [java]
Sin embargo, si intento eliminar en su lugar más de lo que está presente en la TreeSetllamada, la llamada no elimina nada (esta no es una llamada posterior, sino que se llama en lugar del fragmento anterior):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages); // [c++, java, python]
¿Qué estoy haciendo mal? ¿Por qué se comporta de esta manera?
Editar: String::compareToIgnoreCasees un comparador válido:
(l, r) -> l.compareToIgnoreCase(r)