Я просто хочу прояснить что-то относительно кода ниже:
public static void ageOverTen(final List<Human> man) {
final List<Human> byAge = man.stream()
.filter(age -> age.getAge() > 10)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
System.out.println("People over 10 years: " + byAge);
}
В мире Java мы все знаем, что ArrayList
не является потокобезопасным, и он изменен, поэтому, когда вы создаете поток и используете метод collect()
, в нем мы создаем ArrayList
. Как библиотека влияет на безопасность потока ArrayList
и мутацию, чтобы он соответствовал концепции функционального программирования неизменяемости?
Да, collect()
предназначен для работы даже параллельно, даже с не-потокобезопасными изменяемыми структурами данных - при условии соблюдения правил. Эти правила включают в себя невмешательство - что поведенческие параметры, переданные методам потока (lambdas), не изменяют источник потока во время операции, а для большинства операций - безгражданство - что lambdas не имеют доступа к состоянию, которое может измениться во время вычисления.