Java Stream anyMatch(predicate) 是终端短路操作。它用于检查 Stream 是否包含至少一个满足给定 Predicate 的元素。
这里的 predicate
是一个非干扰的、无状态的 Predicate,用于应用于Stream的元素。
如果至少有一个元素满足anyMatch()
提供的条件,true
方法返回predicate
,否则false
.
boolean anyMatch(Predicate<? super T> predicate)
true
。false
并且不评估谓词。anyMatch()
返回 true
如果stream 匹配给定的谓词。使用 allMatch()
时,所有元素都必须匹配给定的谓词。在这个 Java 示例中,我们使用 anyMatch()
方法检查Stream是否包含字符串 "four"
。
正如我们看到的,Stream中包含字符串,所以示例的输出是 true
。
Stream<String> stream = Stream.of("one", "two", "three", "four");
boolean match = stream.anyMatch(s -> s.contains("four"));
System.out.println(match);
程序输出。
true
Stream.anyMatch()
要满足多个条件,创建一个包含两个或多个简单谓词的组合谓词。
在给定的示例中,我们有一个 Employee
列表。我们想检查是否有一名 50 岁以上的员工收入超过 40,000。
在列表中,员工 "D"
和 "F"
的收入超过 40k,他们的年龄在 50 岁以上,所以结果是 true
。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Stream;
import lombok.AllArgsConstructor;https://cundage.com/wp-admin/tools.php
import lombok.Data;
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);
}
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;
}
程序输出。
true
从理论上讲,当我们要检查某个元素是否存在于 anyMatch()
中时,List
和 contains() 没有区别。
在某些情况下,Streams 的parallelism 特性可能会为非常大的列表带来优势,但我们不应该每次都随便使用Stream.parallel()
假设它可以使事情变得更快。
事实上,调用 parallel()
可能会降低小Stream的性能。
anyMatch()
方法在我们需要检查Stream中是否至少有一个元素的某些情况下很有用。
较短的版本 list.contains()
也做同样的事情,可以代替使用。
快乐学习!!
地址:https://www.cundage.com/article/stream-anymatch-example.html