Повторное применение Stream API для сбора в разные структуры

Stream одноразовый: первый collect завершает его использование, второй нарушает контракт. Соберите результат один раз в List, затем создайте Set из списка.

Короткий ответ

Что ответить на собеседовании

Stream одноразовый: первый collect завершает его использование, второй нарушает контракт. Соберите результат один раз в List, затем создайте Set из списка.

Подробный разбор

Ответ с пояснениями

Условие

Есть поток Stream<A> stream, к которому последовательно применяются операции .map(...) и .filter(...). Нужно выполнить два разных сбора результатов:

  • первый собрать в Set<A>;
  • второй собрать в List<A>.

Почему попытка вызвать второй collect(...) может привести к ошибке? Требуется переписать код так, чтобы оба сбора были возможны.

Stream<A> stream = ...map(...).filter(...);

Set<A> resultSet = stream.collect(Collectors.toSet());
List<A> resultList = stream.collect(Collectors.toList());

Ответ

Stream одноразовый: первый collect завершает его использование, второй нарушает контракт. Соберите результат один раз в List, затем создайте Set из списка.

List<A> resultList = stream.collect(Collectors.toList());
Set<A> resultSet = new HashSet<>(resultList);

List сохраняет повторы и encounter order упорядоченного потока; HashSet удаляет дубликаты по equals/hashCode и не гарантирует порядок. Если важен порядок первых вхождений, используйте LinkedHashSet. Альтернатива — фабрика, создающая новый Stream для каждого сбора, но тогда map/filter выполнятся дважды и их побочные эффекты тоже могут повториться.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее