java - 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);
但这现在输出了我所有的列表。
马, 豹, 猫, 狗, 狮子
解决方案
我做错什么了?
您似乎缺少基本的德摩根定律,该定律指出
!(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
推荐阅读
- angular - 带主体的条件插值
- javascript - 如何在 div 中执行关闭窗口按钮?
- html - 如何向 NgZorro Collapse 标题组件添加关闭按钮?
- python - 在我的 for 循环中无法达到预期的打印结果
- maya - 如何测量在 Maya、Creo Parametric、Adobe Premier 等应用程序中执行任何类型的操作所花费的时间
- firebase - 是否需要在我的私有服务器的防火墙中打开任何端口和 IP 以供 Cloud Functions 请求通过?
- mysql - MySQL SELECT 语句,其中请求参数的字符多于数据库中的内容
- c - 如何打印出结构中的扫描件以正确归档?(C)
- javascript - 变量值在 scriptlet 中可用,但在 jsp 和 javascript 中不可用
- android - Android 设备屏幕截图,屏幕录制禁用