文
章
目
录
章
目
录
Java Stream的anyMatch()方法是一个终端短路操作,用于检查流中是否存在至少一个元素满足给定Predicate。
1.Stream的anyMatch() API
1.1 语法
boolean anyMatch(Predicate<? super T> predicate)
如果至少有一个元素满足Predicate条件,则anyMatch()方法返回true,否则返回false。
1.2 描述
- 这是一个短路终端操作。
- 它返回此流中是否有任何元素匹配提供的Predicate。
- 如果没有必要确定结果,可能不会对所有元素应用Predicate。 一旦遇到第一个匹配的元素,方法就会返回true。
- 如果流为空,则返回false,并且不会评估Predicate。
- allMatch()和anyMatch()之间的区别在于,anyMatch()只要流中的任何元素满足给定的Predicate就返回true。 当使用allMatch()时,所有元素都必须匹配给定的Predicate。
2.Stream的anyMatch()例子
示例1:检查流是否包含特定元素
在这个Java示例中,我们使用anyMatch()方法来检查流是否包含字符串”four”。
由于我们看到流包含该字符串,因此该示例的输出为true。
Stream<String> stream = Stream.of("one", "two", "three", "four");
boolean match = stream.anyMatch(s -> s.contains("four"));
System.out.println(match); //true
示例2:使用多个谓词的Stream.anyMatch()
要满足多个条件,请使用两个或多个简单谓词创建一个组合谓词。
在这个例子中,我们有一个Employee类型的列表。 我们想要检查是否有年龄超过50岁并且收入超过40,000的员工。
在列表中,员工”D”和”F”收入超过40k并且年龄超过50岁,因此结果为true。
public class Main
{
public static void main(String[] args)
{
Predicate<Employee> olderThan50 = e -> e.getAge() > 50;
Predicate<Employee> earningMoreThan40K = e -> e.getSalary() > 40_000;
Predicate<Employee> combinedCondition = olderThan50.and(earningMoreThan40K);
boolean result = getEmployeeStream().anyMatch(combinedCondition);
System.out.println(result); //true
}
private static Stream<Employee> getEmployeeStream()
{
List<Employee> empList = new ArrayList<>();
empList.add(new Employee(1, "A", 46, 30000));
empList.add(new Employee(2, "B", 56, 30000));
empList.add(new Employee(3, "C", 42, 50000));
empList.add(new Employee(4, "D", 52, 50000));
empList.add(new Employee(5, "E", 32, 80000));
empList.add(new Employee(6, "F", 72, 80000));
return empList.stream();
}
}
@Data
@AllArgsConstructor
class Employee
{
private long id;
private String name;
private int age;
private double salary;
}
3.anyMatch()与contains()的区别
从理论上讲,当我们想检查列表中是否存在某个元素时,anyMatch()和contains()之间没有区别。在某些情况下,流的并行特性可能为大型List带来优势,但我们不应随意假设使用Stream.parallel()会使事情变得更快。实际上,调用parallel()可能会降低小型流的表现。
4. 结论
anyMatch()方法在某些情况下很有用,我们需要检查流中是否有至少一个元素。更简洁的版本list.contains()也可以达到同样的效果,可以作为替代使用。