另一个常见的数据处理套路是看看数据集中的某些元素是否匹配一个给定的属性。
StreamAPI通过allMatch、anyMatch、 noneMatch、findFirst和findAny方法提供了这样的工具。
1、检查谓词是否至少匹配一个元素
anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”。
比如,你可以用它来看看菜单里面是否有素食可选择
anyMatch方法返回一个boolean,因此是一个终端操作。
2、检查谓词是否匹配所有元素
alMatch方法的工作原理和anyMatch类似,但它会看看流中的元素是否都能匹配给定的谓词。
比如,你可以用它来看看菜品是否有利健康(即所有菜的热量都低于1000卡路里)
和allMatch相对的是noneMatch。
它可以确保流中没有任何元素与给定的谓词匹配。
比如,你可以用noneMatch重写前面的例子
![)[Y_Z}RHQD(W6APMUE%@L1.png
anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的短路,就是Java中 && 和 || 运算符短路在流中的版本。
3、查找元素
findAny方法将返回当前流中的任意元素。
它可以与其他流操作结合使用。
比如,你可能想找到一道素食菜肴。
你可以结合使用filter和findAny方法来实现这个查询
流水线将在后台进行优化使其只需走一遍,并在利用短路找到结果时立即结束。
不过optional是什么?
Optional简介
Optional
在上面的代码中,findAny可能什么元素都没找到。
Java 8的库设计人员引人了optional
可以先了解一下optional里面几种可以迫使你显式地检查值是否存在或处理值不存在的情形的方法。
1)isPresent()将在Optional包含值的时候返回true,否则返回false。
2)ifPresent (Consumer
3)T get()会在值存在时返回值,否则抛出一个NoSuchElement异常。
4)T orElse(T other) 会在值存在时返回值,否则返回一个默认值。
例如,在前面的代码中你需要显式地检查optional对象中是否存在一道菜可以访问其名称
4、查找第一个元素
有些流有一个出现顺序( encounter order )来指定流中项目出现的逻辑顺序(比如由List或排序好的数据列生成的流)。
对于这种流,你可能想要找到第一个元素。
为此有一个findFirst方法,它的工作方式类似于findany。
例如,给定一个数字列表,下面的代码能找出第一个平方能被3整除的数