【发布时间】:2020-04-20 12:14:16
【问题描述】:
同时使用 Java 8 和 Java 11,考虑以下带有 String::compareToIgnoreCase 比较器的 TreeSet:
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]
但是,如果我尝试删除 more 而不是 TreeSet 中的内容,则调用根本不会删除任何内容(这不是后续调用,而是调用而不是 sn -p 以上):
languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP"));
System.out.println(languages); // [c++, java, python]
我做错了什么?为什么会这样?
编辑:String::compareToIgnoreCase 是一个有效的比较器:
(l, r) -> l.compareToIgnoreCase(r)
【问题讨论】:
-
相关错误条目:bugs.openjdk.java.net/browse/JDK-8180409(TreeSet removeAll 与 String.CASE_INSENSITIVE_ORDER 的行为不一致)
-
密切相关的Q&A。
标签: java java-8 comparator java-11 treeset