同时使用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)
5
相关的错误条目:bugs.openjdk.java.net/browse/JDK-8180409(TreeSet removeAll与String.CASE_INSENSITIVE_ORDER的行为不一致)
—
Progman