Java11での述語は、すべての要素をフィルタリングします

ハンズ:

私はJava11を使用するように移動しています。新しい方法を学ぶPredicate.notを、私は唯一の猫の家族を見つけるために私の現在のコードが見つかりました:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);

出力は次のようになります。

ヒョウ、猫、ライオン

今、私は新しいメソッドを使用しようとしていますし、出力が間違って来ています。どのように私はそれを修正するのですか?私は間違って何をしたのですか?

私の後のコード:

Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);

しかし、これは今、すべての私のリストを出力します。

馬、ヒョウ、猫、犬、ライオン

また:

私は間違って何をしたのですか?

あなたは、基本的な欠けているように見えるデ・モルガンの法則のことを述べています

!(a || b) == !a && !b

そして

!(a && b) == !a || !b

どのように私はそれを修正するのですか?

あなたは必要がありますので、使用するようにコードを変更します

Predicate.not(a -> a.equals("dog") || a.equals("horse")); // !(a || b)

これは既存のコードと同等のものでなければなりません

Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");

それはまた、ときに調べることができます。

Predicate<String> notDog = a -> !a.equals("dog");
Predicate<String> notHorse =  a -> !a.equals("horse");
Predicate<String> cats = notDog.and(notHorse); // !a && !b

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=137466&siteId=1