Ответ 1
Да, это безопасно. Потоки не должны/не должны изменять базовую структуру данных.
Несколько выдержек из java.util.stream.Stream
:
Последовательность элементов [& hellip;].
Коллекции и потоки, носящие некоторые поверхностные сходства, имеют разные цели. Коллекции в первую очередь касаются эффективного управления и доступа к их элементам. В отличие от этого, потоки не предоставляют средства прямого доступа или управления их элементами [& hellip;].
Чтобы сохранить правильное поведение, [поведенческие параметры для операций потока & hellip;] должны быть неинтерферирующими (они не изменяют источник потока).
И из Пакет java.util.stream
Описание:
Потоки отличаются от коллекций несколькими способами:
- Нет хранилища. Поток не является структурой данных, в которой хранятся элементы; вместо этого он передает элементы из источника [& hellip;] через конвейер вычислительных операций.
- Функциональный характер. Операция с потоком создает результат, но не изменяет его источник.
Вы также можете увидеть Невмешательство.
[& hellip;] было бы невозможно мутировать базовый объект, учитывая поток из него.
Хотя можно было бы написать собственную реализацию java.util.stream
, которая изменила базовую структуру данных, было бы ошибкой сделать это.; )
В ответ на комментарий от @AlexisC.:
Получение потока из списка [& hellip;] может изменять его содержимое, если оно содержит изменяемые объекты.
Это справедливый вопрос. Если у нас есть поток элементов, которые изменяемы, мы можем сделать:
myObj.stream().forEach(( Foo foo ) -> ( foo.bar = baz ));