Если вы хотите иметь 1 поток через список, вам нужен способ управления двумя различными состояниями, вы можете сделать это, внедрив Consumer в новый класс.

могу выполнить несколько несвязанных операций над элементами одного потока?

Скажи у меня естьList<String> состоит из текста. Каждая строка в списке может содержать или не содержать определенное слово, которое представляет действие для выполнения. Скажем так:

если строка содержит 'of', все слова в этой строке должны быть подсчитаныесли строка содержит «for», то часть после первого вхождения «for» должна быть возвращена, даваяList<String> со всеми подстроками

Конечно, я мог бы сделать что-то вроде этого:

List<String> strs = ...;

List<Integer> wordsInStr = strs.stream()
    .filter(t -> t.contains("of"))
    .map(t -> t.split(" ").length)
    .collect(Collectors.toList());

List<String> linePortionAfterFor = strs.stream()
    .filter(t -> t.contains("for"))
    .map(t -> t.substring(t.indexOf("for")))
    .collect(Collectors.toList());

но тогда список будет пересмотрен дважды, что может привести к снижению производительности, еслиstrs содержал много элементов.

Можно ли как-то выполнить эти две операции, не проходя дважды по списку?

Ответы на вопрос(4)

Ваш ответ на вопрос