Java11中的谓词过滤所有元素

我打算使用Java11。学习一种新的方法Predicate.not,我找到了当前的代码,只找到了cat family:


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

但这现在输出了我所有的清单。


马,豹,猫,狗,狮子


白板的微信
浏览 141回答 2
2回答

江户川乱折腾

我做错了什么?您似乎错过了基本的德摩根定律,该定律指出:!(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 =&nbsp; 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()&nbsp; &nbsp; .filter(Predicate.not("dog"::equals).and(Predicate.not("horse"::equals)))&nbsp; &nbsp; .collect(Collectors.toSet());System.out.println(filterCat);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java