Подтвердить что ты не робот

Является ли Java 8 Stream безопасным типом возврата?

Являются ли безопасные типы возвращаемых Java 8 потоков для общедоступных методов тем, что было бы невозможно мутировать базовый объект с учетом потока из него?

Например, если у меня есть List и return list.stream();, может ли возвращаемое значение каким-либо образом использоваться для изменения исходного списка?

Судя по API, я не думаю, что это возможно, но хотелось бы подтвердить.

4b9b3361

Ответ 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 ));