Java Stream anyMatch()方法详解

后端 潘老师 6个月前 (10-28) 137 ℃ (0) 扫码查看

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()也可以达到同样的效果,可以作为替代使用。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10456.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】