Версия цикла for
лучше подходит для логики этого типа, но если вы действительно хотите использовать потоки, я бы упростил жизнь и сделал бы это в два шага, вместо того чтобы пытаться сбросить все логика в конвейер с одним потоком, что может привести к снижению читабельности кода
int count = (int)someList.stream()
.filter(a -> a.get().equals(“red”))
.count();
IntStream.rangeClosed(1, count)
.mapToObj(X::new)
.collect(toList());
Как уже упоминалось, это ни в коем случае не лучше, чем версия цикла for
, но здесь для иллюстрации, иногда при использовании потоков лучший подход - выполнить несколько проходов, а не пытаться вписать все в один конвейер.