Stream одноразовый: первый collect завершает его использование, второй нарушает контракт. Соберите результат один раз в List, затем создайте Set из списка.
Повторное применение Stream API для сбора в разные структуры
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 выполнятся дважды и их побочные эффекты тоже могут повториться.