簡體   English   中英

Java11中的謂詞過濾所有元素

[英]Predicate in Java11 filters all elements

我正在使用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);

但是現在輸出我的所有列表。

馬,豹,貓,狗,獅子

我做錯了什么?

你似乎錯過了基本的De-morgan法則

!(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

你可以這樣寫:

List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Set<String> filterCat = animals.stream()
    .filter(Predicate.not("dog"::equals).and(Predicate.not("horse"::equals)))
    .collect(Collectors.toSet());
System.out.println(filterCat);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM