Un stream construye una tubería de operaciones intermedias perezosas que no hace nada hasta que se ejecuta una operación terminal, y entonces los elementos fluyen en una sola pasada, y por eso importa filtrar antes de mapear. Los streams paralelos reparten la fuente sobre el ForkJoinPool común compartido. Úsalos solo para trabajo grande, fácil de partir, intensivo en CPU y sin estado mutable compartido, y nunca para E/S bloqueante, porque atarías un pool que comparte toda la aplicación.
Por qué lo preguntan los entrevistadores
El entrevistador quiere saber si entiendes la pereza, la ausencia de estado y dónde se tuercen los streams paralelos, porque el mal uso es común y perjudica a código no relacionado a través del pool compartido. También escuchan si tus lambdas están libres de efectos secundarios y si usas bien los collectors. Indica si escribes streams porque quedan más claros o porque parecen modernos.
Cómo estructurar tu respuesta
- Explica la pereza y la única pasada en la operación terminal.
- Enuncia los requisitos para una ejecución paralela correcta.
- Advierte sobre el pool común compartido y las llamadas bloqueantes.
- Di cómo decides: mide, no supongas.
Ejemplo de respuesta
Las operaciones intermedias solo construyen una tubería; no pasa nada hasta que una operación terminal tira de los elementos, y cada elemento se empuja por toda la cadena en vez de recorrer la colección una vez por operación. Por eso importa el orden, filtrar pronto hace menos trabajo, y por eso operaciones de cortocircuito como findFirst pueden parar la fuente entera antes de tiempo. Con los streams paralelos soy cauto. Reparten la fuente y corren sobre el ForkJoinPool común, que comparte toda la JVM, así que un stream paralelo lento en una petición puede retrasar todo lo demás que lo use. Eso descarta cualquier trabajo bloqueante: he visto un stream paralelo haciendo llamadas HTTP dejar sin recursos a todos los demás streams paralelos del proceso. Donde de verdad ayudan es en un cálculo grande en memoria sobre un array o un ArrayList, que se parten bien, sin estado mutable compartido y sin dependencia de orden. Aun así hago benchmarks, porque el coste de partir y unir se suele comer la ganancia en colecciones de unos pocos miles de elementos. Si necesito un pool dedicado, ejecuto el stream dentro de mi propio ForkJoinPool en vez del común.
¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.
Mira cómo funcionaPreguntas de seguimiento que puedes esperar
- ¿Por qué LinkedList y los streams sobre un iterador son malos candidatos para el paralelismo?
- ¿Cuál es la diferencia entre reduce y collect?
- ¿Cómo rompen las lambdas con estado un stream paralelo?
Más preguntas para Desarrollador Java
Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.
Predecir mis preguntas