Используя 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)