首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java8中findAny()和findFirst()的区别

Java8中findAny()和findFirst()的区别
EN

Stack Overflow用户
提问于 2016-02-12 09:34:43
回答 8查看 61.6K关注 0票数 116

我对Java8中的Stream#findAny()和Java的Stream#findFirst()并不感到困惑。

我所理解的是,两者都将从流返回第一个匹配的元素,例如,当与过滤器一起使用时?

那么,为什么两种方法用于相同的任务?我是不是遗漏了什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-02-12 09:38:35

我所理解的是,两者都将从流返回第一个匹配的元素,例如,当与过滤器一起使用时?

那是胡说。根据javadoc,Stream#findAny()

返回描述流中某些元素的Optional<T>,或者如果流是空的返回空Optional<T>。这个操作的行为是显式的不确定的;它可以自由地选择流中的任何元素。,这是为了允许并行操作中的最大性能;

Stream.findFirst()将返回一个严格描述Optional<T>是流的第一个元素。Stream类没有.findOne()方法,所以我想您的意思是.findFirst()

票数 108
EN

Stack Overflow用户

发布于 2016-02-12 09:40:22

不,两者都将而不是返回流的第一个元素。

来自Stream.findAny() (重点雷):

返回描述流的某个元素Optional,或者如果流是空的返回空的Optional 这是短路终端操作.

此操作的行为是显式不确定的;--它可以自由地选择流中的任何元素。这是为了允许并行操作中的最大性能;代价是同一个源上的多个调用可能不会返回相同的结果。(如果希望获得稳定的结果,请改用findFirst()。)

因此,更简单地说,它可能选择或不选择流的第一个元素。

对于当前特定于Oracle的实现,我相信它将返回非并行管道中的第一个元素。但是,在并行管道中,它并不总是这样,例如执行

代码语言:javascript
运行
复制
System.out.println(IntStream.range(0, 100).parallel().findAny());

当我运行它时,它返回了OptionalInt[50]。无论如何,您必须而不是依赖于此。

票数 61
EN

Stack Overflow用户

发布于 2018-10-22 01:27:46

findFirst返回流的第一个元素,但是findAny可以自由选择流中的任何元素。

代码语言:javascript
运行
复制
List<String> lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
List<String> lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");

Optional<String> findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst();
Optional<String> fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny();

System.out.println(findFirst.get()); //Always print David
System.out.println(fidnAny.get()); //Print Jack/Jill/Julia :behavior of this operation is explicitly nondeterministic
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35359112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档