Неизменяемы ли потоки Java 8? - PullRequest
2 голосов
/ 25 мая 2020

Если мой API предоставляет поток, есть ли способ для клиентов изменить базовую коллекцию?

Например:

class ListWrapper {
  List<String> myList;
  ...
  Stream<String> getStream() {
    return myList.stream();
  }
}

Может ли клиент вызвать listWrapper.getStream() и как-то изменить содержимое myList?

1 Ответ

6 голосов
/ 25 мая 2020

Поток не может изменять базовую коллекцию (если сама коллекция не отображается), поэтому элементы нельзя добавлять или удалять, а также нельзя изменять порядок. Когда вы потребляете поток в терминальной операции, создается новая коллекция (но вы можете собирать ее в другую существующую коллекцию). неизменны. Это плохая практика, но это можно сделать.

Пример:

class Item { public int x; public Item(int x) { this.x = x; } }
var list = List.of(new Item(1), new Item(2));
list.stream().peek(item -> item.x = 3).collect(toList());

Когда поток потребляется с помощью collect (или count, forEach или любого другого терминала операция), обратный вызов peek изменит каждый элемент. После выполнения вышеуказанного кода ваш список будет содержать 2 элемента со значением x=3. peek - произвольно выбранная нетерминальная операция. Такое же поведение можно наблюдать с filter, map / flatMap или любой другой нетерминальной операцией.

По сути это очень похоже на: Is Java "pass -по ссылке »или« передаче по значению »? , только лучше скрыть.

...