带有示例的 Java Stream anyMatch()

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(501)   2023-06-26 07:54:18

Java Stream anyMatch(predicate) 是终端短路操作。它用于检查 Stream 是否包含至少一个满足给定 Predicate 的元素。

1. Stream anyMatch() API

1.1.句法

这里的 predicate 是一个非干扰的、无状态的 Predicate,用于应用于Stream的元素。

如果至少有一个元素满足anyMatch()提供的条件,true方法返回predicate,否则false.

boolean anyMatch(Predicate<? super T> predicate)

1.2.描述

  • 这是一个短路终端操作。
  • 它返回此Stream的任何元素是否与提供的谓词匹配。
  • 如果不需要确定结果,则可以不对所有元素评估谓词。方法在遇到第一个匹配元素时立即返回 true
  • 如果Stream为空,则返回 false 并且不评估谓词。
  • allMatch() 和 anyMatch() 之间的区别anyMatch() 返回 true 如果stream 匹配给定的谓词。使用 allMatch() 时,所有元素都必须匹配给定的谓词。

2. Stream anyMatch() 示例

示例 1:检查 Stream 是否包含特定元素

在这个 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

示例 2:具有多个谓词的 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

3.anyMatch()contains() 之间的区别

从理论上讲,当我们要检查某个元素是否存在于 anyMatch() 中时,List 和 contains() 没有区别。

在某些情况下,Streams 的parallelism 特性可能会为非常大的列表带来优势,但我们不应该每次都随便使用Stream.parallel()假设它可以使事情变得更快。

事实上,调用 parallel() 可能会降低小Stream的性能。

4.总结

anyMatch() 方法在我们需要检查Stream中是否至少有一个元素的某些情况下很有用。

较短的版本 list.contains() 也做同样的事情,可以代替使用。

快乐学习!!

地址:https://www.cundage.com/article/stream-anymatch-example.html

相关阅读

Java 8 Stream.map() 将 Stream&lt;X&gtl; 转换为 Stream&lt;Y&gtl;。对于每个 X 类型的对象,都会创建一个新的 Y 类型的对象,并将其放入新的...
Stream skip(n) 方法用于从给定 Stream 中跳过第一个 'n' 元素。 skip() 方法返回一个新的 Stream,它包含原始 Stream 的剩余元素,在指定的 n 元素被...
Stream flatMap() 方法用于将集合流扁平化为对象流。这些对象是从原始 Stream 中的所有集合组合而来的。 flatMap() 操作具有对 Stream 的元素应用一对多转换的效...
学习使用 Stream.concat() 方法用于将两个流合并为一个流,该流由两个合并流的所有元素组成。 1.流concat()方法 static &lt;T&gtl; Stream&lt;T&...
学习计算 Stream 中由指定过滤器表达式传递的匹配项。统计项目,我们可以使用以下两种方法,都是终端操作,结果是一样的。 Stream.count() Stream.collect(Colle...
Java Stream anyMatch(predicate) 是终端短路操作。它用于检查 Stream 是否包含至少一个满足给定 Predicate 的元素。 1. 流 anyMatch() ...
findFirst() 方法返回一个 Optional 描述 给定流的第一个元素 如果 流 是非空的,或者如果流为空,则为空 Optional。 1.流findFirst()方法 Optiona...
findAny() 方法返回一个 Optional 描述 给定流的任何元素 如果 流 是非空的,或者如果流为空,则为空 Optional。 在非并行流中,findAny() 将在大多数情况下返回...
了解如何使用 Stream toArray() API 将 Stream 转换为数组。在本教程中,我们将看到多个示例,用于将 Stream 元素收集到 数组。 1. Stream toArray...
Java Stream allMatch() 是一个短路终端操作,用于检查流中的所有元素是否满足提供的谓词。 1.流allMatch()方法 1.1.句法 boolean allMatch(Pr...