Java11中的谓词过滤所有元素

时间:2019-01-06 06:52:45

标签: java predicate java-11 functional-interface

我打算使用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);

但这会立即输出我的所有列表。

  

马,豹,猫,狗,狮子

2 个答案:

答案 0 :(得分:12)

  

我做错了什么?

您似乎缺少基本的De-morgan's laws,其中指出了

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

答案 1 :(得分:0)

您可以用这种方式编写它:

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);