Эффективность Stream
по сравнению с базовой для или для каждой петли зависит от обстоятельств.В вашем случае весьма вероятно, что Stream
будет на меньше эффективнее, чем ваш текущий код, среди прочего, по следующим основным причинам:
- Ваша функция с состоянием как вы упомянули.Поддержание состояния с помощью этого метода, вероятно, означает, что нужно использовать какую-то анонимную реализацию
BinaryOperator
для использования с Stream.reduce
, и это станет более объемным и запутанным для чтения, чем ваш текущий код. - Вы замкнуло в вашей токовой петле, и никакая операция
Stream
не будет отражать такого рода эффективность, особенно учитывая это в сочетании с # 1. - Ваша коллекция заказана, что означает, что поток будет перебирать элементы таким образом, очень похожим на ваш существующий цикл.В зависимости от размера вашей коллекции, вы можете получить некоторую эффективность из
parallelStream
, но необходимость поддерживать порядок в этом случае будет означать менее эффективный поток.
Единственное реальное преимущество, которое вы можете получить, переключившись на Stream
, - это разница в потреблении памяти (вы можете оставить allSongs
в памяти и позволить Stream
обработать ее более эффективным способом памяти), что нездесь, похоже, применимо.
В заключение, поскольку операции Stream
были бы еще более сложными для записи и, вероятно, могли бы нанести вред вашей эффективности, я бы порекомендовал вам не проводить это изменение.
При этом я лично не могу придумать решение на основе Stream
, чтобы фактически ответить на ваш вопрос о том, как преобразовать эту работу в Stream
.Опять же, это было бы что-то сложное и странное, включающее редуктор или подобное ... (Я удалю этот ответ, если этого недостаточно.)