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
应该可以解决这个问题,但是这会增加对已经在原始集合中排序的元素进行排序的开销。
答案 0 :(得分:5)
SortedSet
具有已定义的遭遇顺序,并且findFirst()
保证在遇到顺序时返回第一个元素(如果流有一个)。所以规范已经告诉你你想要什么 - 你不需要做任何特别的事情。
BTW,sortedSet.stream().sorted()
将被优化掉(因为从Spliterator
返回的sortedSet.stream()
将具有SORTED
特征),所以这样做实际上不会产生分拣的成本 - 但你仍然不需要这样做。
答案 1 :(得分:4)
是的,SortedSet
从stream()
继承了Collection
javadoc,但你应该看到的是spliterator()
javadoc。这是一段摘录:
{@code Spliterator}
报告{@link Spliterator#DISTINCT}
,{@link Spliterator#SORTED}
和{@link Spliterator#ORDERED}
。
请注意Spliterator.SORTED
特征。这意味着SortedSet
的每个实现都必须返回一个已排序的流。因此,sortedSet.stream().findFirst()
始终返回最低元素。