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)