为了账号安全,请及时绑定邮箱和手机立即绑定

Java11中的谓词过滤所有元素

Java11中的谓词过滤所有元素

白板的微信 2021-03-30 17:09:45
我打算使用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);但这现在输出了我所有的清单。马,豹,猫,狗,狮子
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我做错了什么?


您似乎错过了基本的德摩根定律,该定律指出:


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


查看完整回答
反对 回复 2021-04-14
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以这样写:


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


查看完整回答
反对 回复 2021-04-14
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信