Utilizzando sia Java 8 che Java 11, considerare quanto segue TreeSet
con un String::compareToIgnoreCase
comparatore:
final Set<String> languages = new TreeSet<>(String::compareToIgnoreCase);
languages.add("java");
languages.add("c++");
languages.add("python");
System.out.println(languages); // [c++, java, python]
Quando provo a rimuovere gli elementi esatti presenti in TreeSet
, funziona: tutti quelli specificati vengono rimossi:
languages.removeAll(Arrays.asList("PYTHON", "C++"));
System.out.println(languages); // [java]
Tuttavia, se provo a rimuovere invece più di quanto sia presente in TreeSet
, la chiamata non rimuove nulla (questa non è una chiamata successiva ma viene chiamata invece dello snippet sopra):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages); // [c++, java, python]
Che cosa sto facendo di sbagliato? Perché si comporta in questo modo?
Modifica: String::compareToIgnoreCase
è un comparatore valido:
(l, r) -> l.compareToIgnoreCase(r)