Dúvida em relação ao Stream

4 respostas Resolvido
java
M

Gostaria de saber se vale a pena substituir isto

for (Home home : homes) {
	if (home.getName().equalsIgnoreCase(name)) {
		return home;
	}
}

Por isto

homes.stream().filter(home -> home.getName().equalsIgnoreCase(name))
          .findFirst().orElse(null);`

4 Respostas

Dragoon

Caro Murilo,

Acredito que o papel de cada tipo de código seja resolver um determinado problema (no caso o mesmo problema), isso tem muito da parte fundamental de manutenção e correção de um código. O primeiro código é fácil dar uma manutenção, já o segundo pode acontecer de ser inviável a mudança. Então tudo vai depender do nível da equipe, tudo vai depender da onde fazer esse código e se o mesmo pode conter problemas invisíveis ( que fogem da visão do desenvolvimento ).

Eu particularmente usaria o primeiro, por ser mais simples e resolver o problema de forma mais legível possível, mas, sempre é bom saber que algum dia você possa encontrar um código como o segundo da sua pergunta e consiga dar manutenção …

M

Você sabe se existe alguma diferença em relação a performance?

Dragoon

Sinceramente não, isso precisa ser feito com teste de exaustão, porque talvez os dois do jeito que estão equiparam … eu peguei mas, na parte de manutenção, mas, eu acho que o desempenho é praticamente o mesmo.

peczenyj
Solucao aceita

vamos la

existem 2 pontos que vc deve pensar

o primeiro é legibilidade. o codigo que vc escreveu esta legivel? as outras pessoas que trabalham com vc entendem isso?

não é só pq java permite que a gente tem que fazer. por ser uma API nova isso pode trazer confusão. veja se todo mundo envolvido entende e, se ficar confuso, faça algo ( desde adicionar um comentario, explica pra quem precisa ou num pior caso aborda pq isso pode ser fonte de confusão. escolha as batalhas que vc quer travar, trocar um for por uma api funcional pode não ser tão valioso assim )

o segundo é performance e isso vc pode testar usando alguma ferramenta de benchmark. se vc não sabe como usar, a hora é essa.

eu ainda tentaria comparar o stream com parallelStream

IMHO se a performance é irrelevante eu levo a questão de estilo: se eu tenho um codigo que ja tem ifs e loops encadeados, adicionar um stream + filter pode trazer uma quebra de estilo. a consequencia é que quem bate o olho precisa pensar um pouquinho a mais pra entender o que acontece e erros bobos podem ser mais dificeis de serem percebidos. o estilo de codificação é util pra que os olhos captem padrões.

eu bato o olho num metodo e ja sei se ele esta grande, mesmo não precisando contar o numero de linhas ou statements. e metodos grandes podem ser uma fonte de problema ( quem nunca pegou aquela classe de mil linhas não é mesmo ?).

enfim, algumas coisas que eu falei não são tecnicas.

é comum ao trabalhar com pessoas diferentes é termos abordagens diferentes. as vezes a galera briga por “ain deve ser classe abstrata e não interface” quando no fim é um belo tempo perdido. eu abro mão as vezes pq quero focar em outras coisas: se realmente for um problema isso vai ficar obvio em algum momento.

se vc tem uma boa suite de testes, vc pode substituir um loop por uma api funcional com stream e vai continuar funcionando.

meus conselhos:

  1. veja se este loop realmente precisa de alguma otimização ( como uma busca em paralelo ). talvez o seu gargalo nem esteja ai.
  2. se o codigo ja existe e funciona, deixe como esta. as vezes mudanças banais tornam um debug algo bem mais dificil de ser feito.

alias eis um bom problema: tente debuggar as duas formas. em qual vc se sente mais confortavel?

como colocar um breakpoint dentro do filter?

reflita. e mete bronca

Criado 28 de novembro de 2016
Ultima resposta 28 de nov. de 2016
Respostas 4
Participantes 3