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方法的区别很明显,就是前者随机查出匹配的元素,而后者是只拿取最小集合索引的元素,也就是依次遍历的第一个元素对象。


相关文章
|
存储 关系型数据库 MySQL
ES和mysql的区别
ES和mysql的区别
|
存储 缓存 Java
面试官:你知道包装类的缓存机制吗?
面试官:你知道包装类的缓存机制吗?
1679 0
|
前端开发 应用服务中间件 nginx
Javaweb之前端工程打包部署的详细解析
6 打包部署 我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包
350 0
Javaweb之前端工程打包部署的详细解析
|
Java 数据安全/隐私保护
Springboot拓展之整合邮件 JavaMail的使用与实操
Springboot拓展之整合邮件 JavaMail的使用与实操
397 0
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
4332 3
|
SQL Java 数据库连接
深入解析@MapperScan注解:简化MyBatis接口与映射器的关联
在Java持久化领域,MyBatis是一个广泛使用的ORM(对象关系映射)框架,用于将数据库中的数据映射到Java对象中。MyBatis的核心概念是SQL映射器(Mapper),它定义了数据库操作的方法。为了简化Mapper接口与映射器的关联,MyBatis提供了`@MapperScan`注解。本文将深入探讨`@MapperScan`注解的作用、用法,以及在MyBatis应用中的应用场景。
3125 0
SpringCloud Feign报错:java.lang.IllegalStateException: Method has too many Body parameters
SpringCloud Feign报错:java.lang.IllegalStateException: Method has too many Body parameters
427 0
|
Java API 调度
从Spring Cloud 开始,聊一聊微服务架构的设计与实战
随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。
1504 1
从Spring Cloud 开始,聊一聊微服务架构的设计与实战
|
Java 程序员 应用服务中间件
springboot线程池的使用和扩展
我们常用ThreadPoolExecutor提供的线程池服务,springboot框架提供了@Async注解,帮助我们更方便的将业务逻辑提交到线程池中异步执行,今天我们就来实战体验这个线程池服务,并根据实际需要做定制化的扩展
1228 0
springboot线程池的使用和扩展