文章目录
- 304. Java Stream API - 检查元素是否符合条件
- ✅ `anyMatch()`、`allMatch()` 和 `noneMatch()` 方法
- 🧠 方法简介:
- 🔄 `anyMatch()`、`allMatch()` 和 `noneMatch()` 方法示例
- 🎬 示例:检查流中元素是否匹配某个条件
- 输出:
- 🧑💻 解释:
- 💡 为什么使用这些方法?
- 📌 比较传统的方式:
- 📌 高效的方式:
- 🧑🏫 总结
304. Java Stream API - 检查元素是否符合条件
✅anyMatch()、allMatch()和noneMatch()方法
在使用Java Stream API处理流时,某些情况下你可能不关心找到哪个具体的元素,而是更关注是否存在符合特定条件的元素。这时,可以使用anyMatch()、allMatch()和noneMatch()来进行检查。
这三个方法都接收一个谓词(Predicate)作为参数,并返回一个布尔值。
🧠 方法简介:
anyMatch(predicate):如果流中至少有一个元素匹配给定的谓词,返回true。allMatch(predicate):如果流中的所有元素都匹配给定的谓词,返回true。noneMatch(predicate):如果流中没有任何元素匹配给定的谓词,返回true。
这些方法比通过findFirst()和isPresent()检查是否有符合条件的元素更高效,因为它们不需要构建Optional对象,直接返回布尔值。
🔄anyMatch()、allMatch()和noneMatch()方法示例
🎬 示例:检查流中元素是否匹配某个条件
Collection<String>strings=List.of("one","two","three","four","five","six","seven","eight","nine","ten");booleannoBlank=strings.stream().allMatch(Predicate.not(String::isBlank));// 检查是否所有元素都不是空字符串booleanoneGT3=strings.stream().anyMatch(s->s.length()==3);// 检查是否有元素长度为3booleanallLT10=strings.stream().noneMatch(s->s.length()>10);// 检查是否所有元素的长度都不超过10输出:
noBlank=trueoneGT3=trueallLT10=true🧑💻 解释:
allMatch(Predicate.not(String::isBlank)):检查所有元素是否都不是空字符串。如果流中所有元素都不为空字符串,返回true。anyMatch(s -> s.length() == 3):检查流中是否有任意一个元素的长度为 3。由于"one"、"two"等都满足这个条件,返回true。noneMatch(s -> s.length() > 10):检查流中是否没有元素的长度大于 10。因为所有字符串的长度都小于或等于 10,返回true。
💡 为什么使用这些方法?
📌 比较传统的方式:
如果你使用findFirst()来检查是否有元素符合条件,你会得到一个Optional对象,然后通过isPresent()或其他方法判断是否有元素满足条件。这样会带来额外的性能开销,因为需要创建Optional对象并进行封装。
📌 高效的方式:
使用anyMatch()、allMatch()和noneMatch()方法,你直接得到了布尔值结果,避免了不必要的对象封装和计算,提升了性能,尤其是在流的元素数量较大时。
🧑🏫 总结
| 方法 | 适用场景 | 返回值 | 示例 |
|---|---|---|---|
anyMatch() | 流中是否有元素匹配条件 | true/false | strings.stream().anyMatch(s -> s.length() == 3) |
allMatch() | 流中是否所有元素匹配条件 | true/false | strings.stream().allMatch(Predicate.not(String::isBlank)) |
noneMatch() | 流中是否没有元素匹配条件 | true/false | strings.stream().noneMatch(s -> s.length() > 10) |