企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### [匹配](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e5%8c%b9%e9%85%8d) * `allMatch(Predicate)`:如果流的每个元素提供给**Predicate**都返回 true ,结果返回为 true。在第一个 false 时,则停止执行计算。 * `anyMatch(Predicate)`:如果流的任意一个元素提供给**Predicate**返回 true ,结果返回为 true。在第一个 true 是停止执行计算。 * `noneMatch(Predicate)`:如果流的每个元素提供给**Predicate**都返回 false 时,结果返回为 true。在第一个 true 时停止执行计算。 我们已经在`Prime.java`中看到了`noneMatch()`的示例;`allMatch()`和`anyMatch()`的用法基本上是等同的。下面我们来探究一下短路行为。为了消除冗余代码,我们创建了`show()`。首先我们必须知道如何统一地描述这三个匹配器的操作,然后再将其转换为**Matcher**接口。代码示例: ~~~ // streams/Matching.java // Demonstrates short-circuiting of *Match() operations import java.util.stream.*; import java.util.function.*; import static streams.RandInts.*; interface Matcher extends BiPredicate<Stream<Integer>, Predicate<Integer>> {} public class Matching { static void show(Matcher match, int val) { System.out.println( match.test( IntStream.rangeClosed(1, 9) .boxed() .peek(n -> System.out.format("%d ", n)), n -> n < val)); } public static void main(String[] args) { show(Stream::allMatch, 10); show(Stream::allMatch, 4); show(Stream::anyMatch, 2); show(Stream::anyMatch, 0); show(Stream::noneMatch, 5); show(Stream::noneMatch, 0); } } ~~~ 输出结果: ~~~ 1 2 3 4 5 6 7 8 9 true 1 2 3 4 false 1 true 1 2 3 4 5 6 7 8 9 false 1 false 1 2 3 4 5 6 7 8 9 true ~~~ **BiPredicate**是一个二元谓词,它接受两个参数并返回 true 或者 false。第一个参数是我们要测试的流,第二个参数是一个谓词**Predicate**。**Matcher**可以匹配所有的**Stream::\*Match**方法,所以可以将每一个**Stream::\*Match**方法引用传递到`show()`中。对`match.test()`的调用会被转换成 对方法引用**Stream::\*Match**的调用。 `show()`接受一个**Matcher**和一个`val`参数,`val`在判断测试`n < val`中指定了最大值。`show()`方法生成了整数1-9组成的一个流。`peek()`用来展示在测试短路之前测试进行到了哪一步。从输出中可以看到每次都发生了短路。