Java Stream 中的方法, anyMatch 和 findAny 都是 Stream API 中用于判断数据流中是否存在符合条件的元素的方法。
anyMatch 方法的作用是判断数据流中是否存在至少一个满足条件的元素,并返回一个布尔类型的结果。该方法的使用格式如下:
boolean anyMatch(Predicate<? super T> predicate)
其中,Predicate 是一个函数式接口,用于判断当前元素是否满足某种条件。例如,判断一个整数流中是否有大于等于 10 的元素:
IntStream.range(1, 5).anyMatch(i -> i >= 10) // 返回 false
findAny 方法的作用是从数据流中任意查找一个元素,并返回一个 Optional 类型的结果。该方法的使用格式如下:
Optional<T> findAny()
例如,从一个字符串流中查找任意一个包含字母 a 的字符串:
Stream.of("hello", "world", "java").filter(s -> s.contains("a")).findAny() // 返回 Optional[java]
区别:
- anyMatch 方法返回的是布尔类型的结果,表示是否存在符合条件的元素;而 findAny 方法返回的是 Optional 类型的结果,表示任意一个符合条件的元素,如果不存在符合条件的元素,则返回一个空的 Optional 对象。
- anyMatch 方法只要找到一个符合条件的元素就直接返回结果,不会继续执行数据流中的后续元素;而 findAny 方法则不保证查找的顺序,并且如果数据流是并行执行的,则返回其中任意一个符合条件的元素。
- 由于 anyMatch 方法只要找到一个符合条件的元素就返回结果,因此在一些情况下,它可能会比 findAny 方法更快。但是,如果需要获取符合条件的具体元素,或者需要保证查找的顺序,那么就需要使用 findAny 方法。
例如,对于一个包含 1000000 个元素的整数流,要查找其中是否有偶数,可以使用以下两种方法:
// 使用 anyMatch 方法
IntStream.range(1, 1000000).parallel().anyMatch(i -> i % 2 == 0);
// 使用 findAny 方法
IntStream.range(1, 1000000).parallel().filter(i -> i % 2 == 0).findAny();
根据实验结果,当数据流比较大时,并行执行时 anyMatch 方法的性能比 findAny 方法更好,但是当数据流不大时,两者性能差距不大。