С функциональным стилем вы могли бы сделать это за один раз.Просто имейте функцию, которая проверяет элемент ниже, и аккумулятор будет представлять собой структуру с двумя списками, в которые вы добавляете элементы.
Если вы думаете о передаче списка через ряд функций более высокого порядка, то вы можете уменьшить накладные расходы с помощью Trancducers , который в основном работает как отдельные map
, filter
, но без списковмежду операциями.
Есть потоков , которые используют ленивую оценку, если, возможно, вы не будете использовать все элементы в своем результате.
И есть генераторы .По сути, вы можете сделать несколько циклов for
и использовать ỳield
для «возврата» значения, и вы можете объединить их в цепочку, поскольку все генераторы могут быть повторены с for of
.Также здесь вы можете остановить, когда у вас есть достаточно данных.
Так что для всего этого есть свои плюсы и минусы.Производительность, если вы все равно рассчитываете все элементы с использованием генераторов и потоков, будет немного перегружена.Преобразователи, возможно, являются лучшим вариантом, который дает возможность компоновки с небольшим составлением списка, но цикл, конечно, будет быстрее.
Тестирование легче с функциональными реализациями, и вы можете тестировать отдельные этапы изолированно.Один очень большой цикл, который управляет всем приложением, часто трудно отладить.Это также происходит, когда у вас есть один reduce
, который просто переписывает один цикл в функциональном стиле.