Java-потоки поддерживают как методы sorted
, так и limit
, которые соответственно возвращают отсортированную версию потока и возвращают поток, просто возвращающий указанное количество элементов потока. Когда эти операции применяются последовательно, например:
stream.sorted().limit(qty).collect(Collectors.toList())
сортировка выполняется таким образом, что сортирует элементы qty
или сортируется весь список? Другими словами, если qty
фиксировано, эта операция выполняется в O(n)
? В документации не указывается производительность этих методов отдельно или в сочетании друг с другом.
Причина, по которой я спрашиваю, заключается в том, что очевидной императивной реализацией этих операций было бы сортировать, а затем ограничивать, принимая время Θ(n * log(n))
. Но эти операции вместе могут быть выполнены в O(n * log(qty))
, а интеллектуальная инфраструктура потоковой передачи может просматривать весь поток до его выполнения, чтобы оптимизировать этот частный случай.