JDK8之findAny和findFirst

2,250 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

写在前面

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