查看了一下Java API document:
findFirst:
findFirst
Optional<T> findFirst()Returns an
Optionaldescribing the first element of this stream, or an emptyOptionalif the stream is empty. If the stream has no encounter order, then any element may be returned.This is a short-circuiting terminal operation.
Returns:
an
Optionaldescribing the first element of this stream, or an emptyOptionalif the stream is emptyThrows:
NullPointerException- if the element selected is null
顾名思义,即返回列表中的第一个元素。
这里的short-circuiting是指:有时候需要在遍历中途停止操作,比如查找第一个满足条件的元素或者limit操作。在Stream中short-circuiting操作有:anyMatch、allMatch、noneMatch、findFirst、findAny、limit,这些操作在Sink中都有一个变量来判断是否短路,比如limit用的是m,match用的是stop,find用的是hasValue。
这里的terminal operation是指:一个终结操作,比如foreach,IntStream.sum
那么,findAny是什么呢?
findAny
Optional<T> findAny()Returns an
Optionaldescribing some element of the stream, or an emptyOptionalif the stream is empty.This is a short-circuiting terminal operation.
The behavior of this operation is explicitly nondeterministic(不确定的); it is free to select any element in the stream. This is to allow for maximal performance in parallel operations; the cost is that multiple invocations(调用) on the same source may not return the same result. (If a stable result is desired, use
findFirst()instead.)Returns:
an
Optionaldescribing some element of this stream, or an emptyOptionalif the stream is emptyThrows:
NullPointerException- if the element selected is nullSee Also:
可以看到findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行的情况,那就不能确保是第一个。比如下面的例子会随机地返回OptionalInt[50]。
System.out.println(IntStream.range(0, 100).parallel().findAny());
让我们来举另外一个例子:
原文:https://www.cnblogs.com/ylsx/p/14103694.html