У меня есть Collection
с закодированными объектами (которые являются довольно большими, когда не закодированы) и мне было интересно, что происходит на самом деле, если бы я сделал что-то вроде:Что делает parallelstream(). Map(). Map() do?
codes.parallelStream().map(code -> decode(code)).map(obj -> do1(obj) * do2(obj));
Как я не нашел гораздо больше информации об этом я предполагаю, что это сначала декодирует все элементы и только потом выполняет реальную задачу, но, с другой стороны, было бы логичнее (и полезно для памяти в случае больших объектов) в случае parallelStream
, если бы оно выполняло оба карты одновременно для каждого элемента, например, если есть стояние:
codes.parallelStream().map(code -> { obj = decode(code); return do1(obj) * do2(obj); });
Может ли кто-нибудь помочь мне понять, как это работает?
Спасибо, но если я соберу результаты моих двух карт, чтобы их хранить в новой коллекции, например, они будут оценены, правильно? –
@MrTsjolder Да, но каждый исходный объект будет оцениваться по всем методам конвейера Stream до того, как объект будет оцениваться в том же потоке. Поэтому, если ваш параллельный поток использует 2 потока для выполнения конвейера, каждый поток завершит обработку одного закодированного объекта (т. Е. Выполнит вызовы 'map()'), прежде чем переходить к следующему. – Eran