методы потока с состоянием и без состояния - PullRequest
0 голосов
/ 22 февраля 2019

В интерфейсе Stream:

Промежуточные операции классифицируются как с сохранением состояния, так и без сохранения состояния.Они влияют на результат параллельного потока.

Только две терминальные операции являются недетерминированными методами: findAny () и forEach (Consumer).Они влияют на результат параллельного потока.

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

Промежуточные операции классифицируются в:

С состоянием

  • Different ()
  • sorted ()
  • limit (long l)
  • skip (long l)

Stateless

  • карта (функция f)
  • flatMap (функция f)
  • фильтр (предикат p)
  • peek (потребитель c)

Это два моих вопроса:

  1. Промежуточные методы без состояния

    • Если я вызову промежуточные методы без состояния для параллельного потока + недетерминированный forEach (), я получу то же самоерезультат последовательного потока, но с другим порядком.
    • Если я вызову промежуточные методы без состояния в параллельном потоке + недетерминированный findAny (), я получу непредсказуемый результат.
    • Если я вызову промежуточные методы без состояния в параллельном потоке + нормальная работа терминала, я будуполучить тот же результат последовательного потока.
    • Если я вызову промежуточные методы без состояния для параллельного потока + нормальная работа терминала с побочным эффектом, я получу непредсказуемый результат.
  2. промежуточные методы с сохранением состояния

    • Если я вызову промежуточные методы с сохранением состояния + недетерминированный метод forEach (), я получу тот же результат последовательного потока, но с другим порядком.
    • Если я вызову промежуточные методы с сохранением состояния + недетерминированный findAny (), я получу непредсказуемый результат.
    • Если я вызову промежуточные методы с сохранением состояния + нормальную работу терминала, я получу тот же результат последовательного потока.

Правильны ли эти правила?

Порядок элементов Stream - «порядок встречи», за исключением того, что я вызываю метод BaseStream: unordered ().Влияет ли порядок элементов на результаты потока (при наличии методов с состоянием или без состояния)?Если да, то как?

Большое спасибо!

A.

1 Ответ

0 голосов
/ 22 февраля 2019

Я думаю, что оба условия 1 и 2 выполняются.Я хочу добавить некоторые операции.

reduce также является частью операции с состоянием.

forEach является частью операции без сохранения состояния.

Обратите внимание, что операции без сохранения состояния могут стать состояниями, если они создаютпобочные эффекты.

Третье утверждение не совсем правильно.Если поток упорядочен, и мы обрабатываем его параллельно, поток останется упорядоченным при использовании с операциями без сохранения состояния.Вот почему нам нужно вызвать метод unordered() в потоке, чтобы сделать его неупорядоченным и повысить эффективность.

...