繁体   English   中英

SortedSet.stream()上的findFirst()

[英]findFirst() on SortedSet.stream()

SortedSet的java 8 API文档仅声明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()应该可以解决这个问题,但是这会增加对已经在原始集中排序的元素进行排序的开销。

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

BTW, sortedSet.stream().sorted()将得到优化(因为Spliterator从返回sortedSet.stream()将有SORTED特性),所以这样做实际上并没有招致排序的成本-但你仍然不需要这样做。

是的, SortedSetCollection继承了stream() javadoc,但你真正应该看的是spliterator() javadoc。 这是一段摘录:

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

请注意Spliterator.SORTED特性。 这意味着SortedSet每个实现都必须返回一个已排序的流。 因此, sortedSet.stream().findFirst()始终返回最低元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM