SortedSet.stream()上的findFirst()

时间:2017-03-08 10:37:22

标签: java java-8 java-stream

stream()的java 8 API文档仅指出java.util.Collection是从sortedSet.stream().filter(...).findFirst()继承的(请参阅https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html)。这意味着流是顺序的,但可能不是有序的。

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

Stream.sorted() api doc:如果流没有遭遇订单,则可能会返回任何元素。

import datetime time1=datetime.datetime(2016,12,8,20,5,0) time2=datetime.datetime(2016,12,7,19,43,10) timediff=time1-time2 print(timediff) print(timediff.seconds) >1 day, 0:21:50 >1310 应该可以解决这个问题,但是这会增加对已经在原始集合中排序的元素进行排序的开销。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

是的,SortedSetstream()继承了Collection javadoc,但你应该看到的是spliterator() javadoc。这是一段摘录:

  

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

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