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