我对Java8中的Stream#findAny()
和Java的Stream#findFirst()
并不感到困惑。
我所理解的是,两者都将从流返回第一个匹配的元素,例如,当与过滤器一起使用时?
那么,为什么两种方法用于相同的任务?我是不是遗漏了什么?
发布于 2016-02-12 09:38:35
我所理解的是,两者都将从流返回第一个匹配的元素,例如,当与过滤器一起使用时?
那是胡说。根据javadoc,Stream#findAny()
返回描述流中某些元素的
Optional<T>
,或者如果流是空的返回空Optional<T>
。这个操作的行为是显式的不确定的;它可以自由地选择流中的任何元素。,这是为了允许并行操作中的最大性能;
而Stream.findFirst()
将返回一个严格描述的Optional<T>
,是流的第一个元素。Stream
类没有.findOne()
方法,所以我想您的意思是.findFirst()
。
发布于 2016-02-12 09:40:22
不,两者都将而不是返回流的第一个元素。
来自Stream.findAny()
(重点雷):
返回描述流的某个元素
Optional
的,或者如果流是空的返回空的Optional
。 这是短路终端操作.
此操作的行为是显式不确定的;--它可以自由地选择流中的任何元素。这是为了允许并行操作中的最大性能;代价是同一个源上的多个调用可能不会返回相同的结果。(如果希望获得稳定的结果,请改用findFirst()
。)
因此,更简单地说,它可能选择或不选择流的第一个元素。
对于当前特定于Oracle的实现,我相信它将返回非并行管道中的第一个元素。但是,在并行管道中,它并不总是这样,例如执行
System.out.println(IntStream.range(0, 100).parallel().findAny());
当我运行它时,它返回了OptionalInt[50]
。无论如何,您必须而不是依赖于此。
发布于 2018-10-22 01:27:46
findFirst返回流的第一个元素,但是findAny可以自由选择流中的任何元素。
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
https://stackoverflow.com/questions/35359112
复制相似问题