SortedSet.stream()上的findFirst()

Rob*_*ben 2 java java-8 java-stream

java 8 API doc SortedSet仅适用于stream()继承的状态java.util.Collection(请参阅https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html).这意味着流是顺序的,但可能不是有序的.

那么,确保sortedSet.stream().filter(...).findFirst()行为与for( ... )返回第一个匹配元素的经典循环相同的最安全方法是什么?或者情况已经如此,但不保证是API?

(findFirst()api doc:如果流没有遭遇顺序,则可以返回任何元素.)

Stream.sorted() 应该做的伎俩,但这增加了排序元素的开销,这些元素已经在原始集合中排序.

Zhe*_*lov 5

是的,SortedSet从 继承了stream()javadoc Collection,但是您真正应该看的是spliterator()javadoc。这是摘录:

{@code Spliterator}报告{@link Spliterator#DISTINCT}{@link Spliterator#SORTED}{@link Spliterator#ORDERED}

注意Spliterator.SORTED特征。这意味着 的每个实现都SortedSet必须返回一个已排序的流。所以,sortedSet.stream().findFirst()总是返回最低的元素。


Bri*_*etz 5

SortedSet具有已定义的遭遇顺序,并且findFirst()如果流具有,则保证返回遇到顺序中的第一个元素.所以规范已经告诉你你想要什么 - 你不需要做任何特别的事情.

BTW,sortedSet.stream().sorted()将被优化掉(因为Spliterator返回的sortedSet.stream()将具有SORTED特征),所以这样做实际上不会产生排序成本 - 但你仍然不需要这样做.