Потоки должны быть свободны от побочных эффектов, за исключением операций терминала, которые предназначены для побочных эффектов (foreach). То, что вы делаете, нарушает эту парадигму. Стоимость повторной потоковой передачи полученного списка с последующей фильтрацией по другим критериям для добавления в другой список незначительна, если в вашем списке нет миллионов элементов, и даже в этом случае я бы выступил против нарушения парадигм языка для получения небольшой производительности. boost.
List<Customer> customersWithMoreThan100Points = customers
.stream()
.filter(c -> c.getPoints() > 100)
.collect(Collectors.toList());
List<SupplementaryCustomer> supplementaryCustomersWithMoreThan100Points = customersWithMoreThan100Points
.stream()
.filter(c -> c.isSupplementaryCustomer())
.collect(Collectors.toList());
Его легче читать, он менее сложен, более соответствует целям Streams, и я сомневаюсь, что вы найдете заметную (или даже измеримую) потерю производительности в любом типичном случае использования.