Если вы хотите знать, какой из них лучший, лучше всего сравнить его: вы можете повторно использовать мой ответ JMH тест .
Следует отметить, что:
List::sort
используйте Arrays::sort
. Это создает массив перед сортировкой. Он не существует для других Collection
.
Stream::sorted
выполняется как состояние полной промежуточной операции. Это означает, что Stream
нужно запомнить его состояние.
Без тестирования я бы сказал, что:
- Вы должны использовать
collection.sort()
. Легче читать: collection.stream().sorted().collect(toList())
- это способ долго читать, и если вы не отформатируете свой код хорошо, у вас может возникнуть головная боль (я преувеличиваю), прежде чем понять, что эта строка просто сортирует.
sort()
на Stream
следует называть:
- , если вы фильтруете много элементов, делая
Stream
по размеру меньше, чем коллекция ( сортирует N элементов, затем фильтрует N элементов не то же самое, что фильтрует N элементов, а затем сортирует K элементов с K <= N </em>).
- если у вас есть преобразование карты после сортировки, и вы теряете способ сортировки с использованием оригинального ключа.
Если вы используете ваш поток с другой промежуточной операцией, тогда sort
может потребоваться / полезно:
collection.stream() // Stream<U> #0
.filter(...) // Stream<U> #1
.sorted() // Stream<U> #2
.map(...) // Stream<V> #3
.collect(toList()) // List<V> sorted by U.
;
В этом примере фильтр применяется перед сортировкой: поток # 1 меньше, чем # 0, поэтому стоимость сортировки с потоком может быть меньше, чем Collections.sort ().
Если все, что вы делаете - это просто фильтрация, вы также можете использовать операцию TreeSet
или collectingAndThen
:
collection.stream() // Stream<U> #0
.filter(...) // Stream<U> #1
.collect(toCollection(TreeSet::new))
;
Или:
collection.stream() // Stream<U>
.filter(...) // Stream<U>
.collect(collectingAndThen(toList(), list -> {
list.sort();
return list;
})); // List<V>