304. Java Stream API - 检查元素是否符合条件

15 阅读2分钟

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

boolean noBlank = strings.stream()
    .allMatch(Predicate.not(String::isBlank));  // 检查是否所有元素都不是空字符串

boolean oneGT3 = strings.stream()
    .anyMatch(s -> s.length() == 3);  // 检查是否有元素长度为3

boolean allLT10 = strings.stream()
    .noneMatch(s -> s.length() > 10);  // 检查是否所有元素的长度都不超过10
输出:
noBlank = true
oneGT3  = true
allLT10 = 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/falsestrings.stream().anyMatch(s -> s.length() == 3)
allMatch()流中是否所有元素匹配条件true/falsestrings.stream().allMatch(Predicate.not(String::isBlank))
noneMatch()流中是否没有元素匹配条件true/falsestrings.stream().noneMatch(s -> s.length() > 10)