Java 8, метод сбора, создание нового массива и мутации [дубликаты]

1

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

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

  • 0
    Большое спасибо
  • 1
    В частности, в связанном ответе: « Это также относится к любым вашим собственным неконкурентным коллекторам, которые вы могли бы реализовать. Они могут безопасно использоваться с параллельными потоками, если ваши коллекторы не мешают источнику потока, являются побочными без эффекта, независимо от порядка и т. д. »
Теги:
java-8
java-stream
thread-safety

1 ответ

2
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню