一、基本介绍
Stream类提供了很多中间操作方法,如filter()、map()、distinct()等;而通过调用一个终端操作方法,比如forEach()、toArray()、reduce(),则可以执行 Stream 的生成与计算,而只能消费一次。在这其中,findAny() 操作属于短路操作,其目的是在尽可能少的元素上执行操作。
二、返回值
返回一个包含任意元素的 Optional,如果流序列为空则返回空 Optional。
findAny() 尽量使用短时间内最快的方式返回结果。在使用并行流时,findAny() 总是返回原始流中的任意一个元素,而在使用串行流时,则返回第一个元素。
三、与FindFirst的区别
findFirst() 与 findAny() 的区别主要是出现在使用并行流时。在使用并行流时,findAny() 效果会更好,如果不关心返回的元素是哪个应该使用 findAny(),因为它在并行上限制较少。
如果希望程序更快地响应查找结果,并希望结果在较短的时间内返回,则使用 findAny() 方法是更好的选择。
四、示例代码1
List<String> list = Arrays.asList("apple", "banana", "kiwi", "peach", "cherry"); Optional<String> any = list.parallelStream().filter(fruit -> fruit.startsWith("k")).findAny(); if (any.isPresent()) { System.out.println(any.get()); } else { System.out.println("No match found"); }
在上面的示例中,findAny() 返回了第一个以 k 开头的 String 元素 “kiwi”。
五、示例代码2
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); Optional<Integer> any = nums.parallelStream().filter(num -> num % 2 == 0).findAny(); if (any.isPresent()) { System.out.println(any.get()); } else { System.out.println("No match found"); }
在上面的示例中,findAny() 返回了第一个满足条件的 Integer 元素 2。
六、注意事项
使用 findAny() 时应该明确这个方法返回的是任意元素,并不保证返回第一个元素。因此,在使用时必须把这个因素考虑在内。
在并行处理时使用 findAny(),因为它只会处理结果数据的一部分。而对顺序重要的操作,比如排序,或者在返回值中使用 limit() 方法,则应该使用 findFirst()。
七、总结
本篇文章详细介绍了 findAny() 方法的用法和注意事项。在使用 findAny() 方法时,需要注意其返回任意元素的特点,并且在并行处理时效率更高。而对于顺序敏感的操作,则应该使用findFirst() 方法。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/254536.html