Pergunta de entrevista para Desenvolvedor Java

Como streams funcionam por baixo dos panos, e quando você usaria um parallel stream?

O que o entrevistador está avaliando, como estruturar sua resposta e um exemplo falado que você pode adaptar.

Resposta rápida

Um stream monta um pipeline de operações intermediárias preguiçosas que não fazem nada até uma operação terminal rodar, e aí os elementos passam numa única passada, e é por isso que filtrar antes de mapear importa. Parallel streams dividem a fonte no common ForkJoinPool compartilhado. Use só para trabalho grande, facilmente divisível, CPU bound e sem estado mutável compartilhado, e nunca para I/O bloqueante, porque você amarraria um pool que a aplicação inteira compartilha.

Por que os entrevistadores perguntam isso

O entrevistador quer saber se você entende preguiça, ausência de estado e onde parallel streams dão errado, porque o mau uso é comum e prejudica código não relacionado por causa do pool compartilhado. Eles também estão ouvindo por lambdas sem efeito colateral e uso correto de collectors. Isso sinaliza se você escreve streams porque são mais claros ou porque parecem modernos.

Como estruturar sua resposta

  • Explique a preguiça e a passada única na operação terminal.
  • Enuncie os requisitos para execução paralela correta.
  • Avise sobre o common pool compartilhado e chamadas bloqueantes.
  • Diga como você decide: meça, não presuma.

Exemplo de resposta

Exemplo falado, em primeira pessoa

Operações intermediárias só montam um pipeline; nada acontece até uma operação terminal puxar os elementos, e cada elemento é empurrado pela cadeia inteira em vez de a coleção ser percorrida uma vez por operação. É por isso que a ordem importa, filtrar cedo faz menos trabalho, e por isso operações de curto circuito como findFirst conseguem parar a fonte inteira mais cedo. Com parallel streams eu sou cauteloso. Eles dividem a fonte e rodam no common ForkJoinPool, que é compartilhado pela JVM inteira, então um parallel stream lento numa requisição pode atrasar todo o resto que usa ele. Isso descarta qualquer trabalho bloqueante: eu já vi um parallel stream fazendo chamadas HTTP matar de fome todos os outros parallel streams do processo. Onde eles realmente ajudam é numa computação grande em memória sobre um array ou um ArrayList, que dividem de forma uniforme, sem estado mutável compartilhado e sem dependência de ordem. Mesmo assim eu meço, porque o custo de dividir e juntar costuma comer o ganho em coleções de poucos milhares de elementos. Se eu preciso de um pool dedicado, eu rodo o stream dentro do meu próprio ForkJoinPool em vez do common.

Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.

Veja como funciona

Perguntas de acompanhamento que você pode esperar

  • Por que LinkedList e streams vindos de um iterator são candidatos ruins a paralelismo?
  • Qual é a diferença entre reduce e collect?
  • Como lambdas com estado quebram um parallel stream?

Mais perguntas para Desenvolvedor Java

Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.

Prever minhas perguntas

Ensaie as perguntas difíceis antes que elas apareçam

Pratique com um copiloto ao vivo e depois entre pronto. Um Session Pass de $29 te leva até o fim da entrevista, sem assinatura e sem amarras.

Instalar o GhostPilot