JDK8之findAny和findFirst

简介: JDK8之findAny和findFirst

写在前面


JDK8出世后,很多编程方式发生了一些变化,比如函数式编程,Lambda表达式,这些都使得我们的编程更有效率。


其中,JDK8中的Stream相关API,大大的提高了我们在实际开发中的效率,原本使用十行代码,先如今可以用一行代码,而且更高的效率来代替。


最近正在学习Stream,所以特此记录一些有必要的问题,希望对大家有所帮助。


问题


今天我们的问题就是Stream流中的findAny和findFirst有着什么样的区别?


在工作中如果使用不当,随着项目运行时间的加长,会突然爆发一些很麻烦的问题。遇见疑惑,解决疑惑,才是根本所在。


解答


首先,这两个方法都是用来找出并返回所查询列表中的第一个元素对象,这两者又有些差异。


让我们来看一下平时我们使用的代码示例。


具体应用代码如下:


List<String> list0 = Arrays.asList("纪晓岚", "和珅", "黄三", "张三", "张四","黄四");
List<String> list1 = Arrays.asList("纪晓岚", "和珅", "黄三", "张三", "张四","黄四");
Optional<String> findFirst = list0.Stream().filter(s -> s.startsWith("张")).findFirst();
Optional<String> fidnAny = list1.Stream().filter(s -> s.startsWith("张")).findAny();
System.out.println(findFirst.get()); 
System.out.println(fidnAny.get()); //会随机地打印出Jack/Jill/Julia


第一行的输出,无论执行多少次,都只会打印出“张三”。


第二行的输出,则是会随机的打印出张三、张四。


其中的findAny方法,是会随机返回一个元素,所以如果存在多个值的话,使用此方法时,不能保证多次返回的元素的一致性。


而findFrist方法,就是切实的返回集合中的第一个元素对象了。


总结


经过我们的例子来看,findAny方法和findFirst方法的区别很明显,就是前者随机查出匹配的元素,而后者是只拿取最小集合索引的元素,也就是依次遍历的第一个元素对象。


相关文章
|
资源调度 分布式计算 监控
|
前端开发 应用服务中间件 nginx
Javaweb之前端工程打包部署的详细解析
6 打包部署 我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包
473 0
Javaweb之前端工程打包部署的详细解析
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
35776 1
|
JSON JavaScript 前端开发
springboot中使用knife4j访问接口文档的一系列问题
本文介绍了在Spring Boot项目中使用Knife4j访问接口文档时遇到的一系列问题及其解决方案。作者首先介绍了自己是一名自学前端的大一学生,熟悉JavaScript和Vue,正在向全栈方向发展。接着详细说明了如何解决Swagger请求404错误,包括升级Knife4j依赖、替换Swagger 2注解为Swagger 3注解以及修改配置类中的代码。最后,针对报JS错误的问题,提供了删除消息转换器代码的解决方法。希望这些内容能对读者有所帮助。
3423 5
|
Java 应用服务中间件 AHAS
快速体验 Sentinel 集群限流功能,只需简单几步
️ Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器。 Sentinel 从 1.4.0 版本开始提供集群流控特性,但使用 Sentinel 集群限流需要对一系列的动态数据源进行相关配置,并且需要对开源控制台进行一些改造,有一定的使用成本。
16525 99
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
Java 程序员 应用服务中间件
springboot线程池的使用和扩展
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务,并根据实际需要做定制化的扩展
1321 0
springboot线程池的使用和扩展
|
存储 安全 物联网
裸金属服务器适合哪些场景使用,有哪些优势
裸金属架构虚拟系统无需安装操作系统或虚拟化软件,而是通过虚拟化技术直接将硬件资源分配给应用,这种架构消除了传统虚拟化技术中的操作系统层,使虚拟机能够直接访问物理硬件资源,实现了更高的性能和更低的延迟,从而提供接近物理机的性能和效率。
|
前端开发 JavaScript
掌握 Promise.all:优雅处理多个异步操作
掌握 Promise.all:优雅处理多个异步操作