2017-09-12 27 views
7

如在this question中所述,distinct()的实现能够在运行时知道其操作的流被排序时使用更高效的算法。如果我们知道该流是排序的(例如,因为它来自外部预先排序的数据源,例如带有order by子句的SQL查询),但是没有被标记为这样,我们如何才能达到类似的结果?有一个unordered()操作可以删除排序标志,但据我所知,没有办法告诉系统数据已经从外部排序。Java Streams:预排序流上的distinct()?

回答

3

你可以创建你的spliterator围绕现有的集合,例如:

List<Integer> list = Arrays.asList(1, 2, 3, 4); 

    Spliterator<Integer> sp = Spliterators.spliterator(list, Spliterator.SORTED); 

    System.out.println(sp.hasCharacteristics(Spliterator.SORTED)); // true 
+0

我使用第三方库中产生的数据流,所以我完全不创造spliterators自己。我想我*可以使用某种代理分割器,这可能会起作用。 – Jules

+0

是的,报告不同特征的包装分割器似乎是唯一的解决方案。 – Holger