Java 8, метод сбора, создание нового массива и мутация

Я просто хочу уточнить кое-что относительно кода ниже:

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 потокобезопасность и мутацию, чтобы она соответствовала концепции неизменности функционального программирования?


person user3680750    schedule 27.05.2014    source источник
comment
В частности, в связанном ответе: Это также относится к любому из ваших собственных неконкурентных сборщиков, которые вы могли бы реализовать. Их можно безопасно использовать с параллельными потоками, если ваши сборщики не мешают источнику потока, не имеют побочных эффектов, не зависят от порядка и т. д.   -  person assylias    schedule 27.05.2014


Ответы (1)


Да, collect() предназначен для работы даже параллельно, даже с небезопасными для потоков изменяемыми структурами данных — при условии, что вы следуете правилам. Эти правила включают невмешательство: поведенческие параметры, передаваемые методам потока (лямбда-выражениям), не изменяют источник потока во время операции, а для большинства операций отсутствие состояния -- что лямбда-выражения не имеют доступа к состоянию, которое может измениться во время вычисления.

person Brian Goetz    schedule 27.05.2014