Java 8 Stream.findFirst()只在排序后才有意义



流是无序的数据束,索引无法访问其成员。在这种情况下,的含义是什么

Stream.findFirst()

方法?什么";第一个";元素是指未排序的流吗?只是为了找到满足特定条件的任何元素,我们确实有方法

Stream.findAny()

对于Stream.findFirst(),根据Java文档:

返回一个描述此流的第一个元素的{@link Optional},如果流为空,则返回一个空的{@code Optional}。如果流没有相遇顺序,那么可以返回任何元素

通常,流没有任何顺序,除非明确排序

Stream.sort()

方法。

也就是说,Stream.findFirst()应该只有在流也被排序的情况下才有意义。

我说得对吗?请帮忙!

通常,流没有任何顺序,除非通过Stream.sort()方法显式排序。

这不是真的。来自文档:

流是否有相遇顺序取决于源和中间操作。

流是否有相遇顺序取决于以及您使用的中间操作。sorted只是制作有序流的方法之一。

文件继续说:

某些流源(如List或数组(本质上是有序的,而其他流源(例如HashSet(则不是。

因此,您可以确保List.stream()将始终为您提供有序流,而该流上的findFirst将为您提供列表的第一个元素。

在无序流上的findFirst,正如您引用的那样,将返回任何元素。这意味着不能保证返回哪个元素。它可能是第一个,但也可能是其他东西。

不能保证返回哪个元素。

Findfirst将始终在任何中间过程完成后找到方法处理的第一个元素。这里有一个例子。

int[] a = {1,7,3,5,6,9,8};
int res =  Arrays.stream(a).boxed().filter(i->i%2 == 0).findFirst().get();
System.out.println(res);

打印

6

它是通过过滤器的第一个偶数。对于同一个数组,由于没有中间操作来更改流,下面将返回1。

int res =  Arrays.stream(a).boxed().findFirst().get();

findFirst相比,findAny可能会在顺序流中返回相同的元素。在并行操作中,即使在同一源的顺序操作中,findFirst也总是会找到第一个返回的。CCD_ 13不会,因为不同的线程在不可预测的时间内会遇到不同的值。

最新更新