Хорошо, посмотрите, какой ответ от Стюарта Маркса здесь - он использует предикат с состоянием.
Есть несколько потенциальных проблем, но если вы не заботитесь о них или действительно понимаете их - с вами все будет в порядке.
Первый - это порядок, выставленный в текущей реализации для параллельной обработки, но если вы не заботитесь о порядке, как в вашем примере, у вас все в порядке.
Второй - это потенциальная скорость. AtomicInteger
будет в несколько раз медленнее, чем простой int, как сказано, если вы заботитесь об этом.
Третий более тонкий. Иногда нет никакой гарантии, что map
будет выполнен вообще, например, начиная с java-9:
someStream.map(i -> /* do something with i and numbers */)
.count();
Смысл в том, что, поскольку вы считаете, нет необходимости выполнять отображение, поэтому оно пропущено. В общем, элементы, попавшие в какую-то промежуточную операцию, не гарантированно попадают в терминальную. Представьте себе ситуацию map.filter.map
, первая карта может «видеть» больше элементов по сравнению со второй, потому что некоторые элементы могут быть отфильтрованы. Поэтому не рекомендуется полагаться на это, если только вы не можете точно определить, что происходит.
В вашем примере, ИМО, вы более чем безопасно делать то, что делаете; но если вы немного измените свой код, это потребует дополнительных доводов, чтобы доказать его правильность. Я бы пошел с решением 2, просто потому, что для меня это намного легче понять, и у него нет потенциальных проблем, перечисленных выше.