Операция toArray
является разновидностью изменяемой редукции, хотя и не реализована точно так же, как операция collect
. Напротив, в некоторых случаях это более эффективно. Но это неуказанные детали реализации. Сама документация toArray
ничего не говорит о том, как она реализована, поэтому по вашему вопросу вам придется прибегнуть к более общим утверждениям:
… Все операции с потоками могут выполняться как последовательно, так и параллельно.
…
За исключением операций, определенных как явно недетерминированные, таких как findAny()
, независимо от того, выполняется ли поток последовательно или параллельно, результат вычислений не должен меняться.
…
Большинство потоковых операций принимают параметры, описывающие заданное пользователем поведение, которые часто представляют собой лямбда-выражения. Чтобы сохранить правильное поведение, эти поведенческие параметры должны быть не влияющими и в большинстве случаев должны быть без сохранения состояния.
Таким образом, независимо от того, как это реализовано, toArray
является потоковой операцией, которая может выполняться параллельно, и, поскольку она не имеет каких-либо ограничений или недетерминированного поведения, она будет давать тот же (правильный) результат, что и в последовательном режиме. Это единственное, о чем вы должны думать.
Но если вы используете перегруженный метод toArray(IntFunction)
, вы несете ответственность за предоставление соответствующей функции, например. SomeType[]::new
всегда невмешательна и не имеет состояния, поэтому форма toArray(SomeType[]::new)
также является потокобезопасной.
01.02.2016