[英]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
特性),所以这样做实际上并没有招致排序的成本-但你仍然不需要这样做。
是的, SortedSet
从Collection
继承了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.