En utilisant à la fois Java 8 et Java 11, tenez compte des éléments suivants TreeSetavec un String::compareToIgnoreCasecomparateur:
final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");
System.out.println(languages);                 // [c++, java, python]Lorsque j'essaie de supprimer les éléments exacts présents dans le TreeSet, cela fonctionne: tous ceux spécifiés sont supprimés:
languages.removeAll(Arrays.asList("PYTHON", "C++"));
System.out.println(languages);                 // [java]Cependant, si j'essaie de supprimer à la place plus que ce qui est présent dans le TreeSet, l'appel ne supprime rien du tout (ce n'est pas un appel ultérieur mais appelé à la place de l'extrait ci-dessus):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages);                 // [c++, java, python]Qu'est-ce que je fais mal? Pourquoi se comporte-t-il de cette façon?
Modifier: String::compareToIgnoreCaseest un comparateur valide:
(l, r) -> l.compareToIgnoreCase(r)