Olá Clayton! A informação que você possui está correta, código encadeado não é uma boa prática. No entanto você comparar o Lambda a um código encadeado é meio errôneo. Quando utilizamos código encadeado dependemos de cada método para chamar o próximo porque trabalhamos com os retornos dos métodos. A exemplo vou utilizar o que você falou:
Ao chamarmos o método metodo()
ele nos retorna um objeto, a partir desse objeto nós chamamos o segundo método, chamadoDentroDeMetodo()
, assim esse método também retorna um objeto e a partir desse objeto você chama outro método e ai sucessivamente.
Então quando tomamos um NullPointerException em um código encadeado temos que verificar onde é o Null, pois pode vir de qualquer retorno.
Já quando utilizamos Lambda, utilizamos um objeto pra chamarmos um método e outros métodos estão dentro desse método. Seria como se fosse da seguinte forma:
public void metodo(){
chamadoDentroDeMetodo();
}
Logo, apenas um objeto é utilizado então o NullPointerException apenas poderá dar nele, ou em algum parâmetro que o método utilizar. Para ficar mais claro, veja esse exemplo:
palavras.forEach(new Consumer<String>() {
public void accept(String s) {
System.out.println(s);
}
});
O lambda ficaria da seguinte forma:
palavras.forEach((String s) -> {
System.out.println(s);
});
Veja o que acontece, o método forEach()
pede como parâmetro um Consumer, então nos Instanciamos esse consumer, chamamos o método accept
dele e dentro do método accept
nós imprimimos a String como parâmetro, ou seja chamamos o método System.out.println(s);
Mas veja que dentro do método accepts nós chamamos o System.out.println(s)
. Ou seja em caso de NullPointerException nós só poderiamos pensar em ou ser no System.out.println(s);
ou logo no ínicio no forEach()
, pois são os únicos métodos que utilizam objeto, o forEach utiliza o Consumer e o System.out.println(s) a String. Enquanto que no código encadeado pensaríamos em todos, pois todos nos retornam um objeto. O lambda é apenas uma forma mais simplificada de ter que escrever código desnecesário. Veja que na forma normal temos que escrever o método accept()
, mas a unica utilidade dele é chamar o System.out.println(s)
então é desnecessário escrever ele, o mais importante é o System.out.println(s)
.
Espero ter ajudado! Bons estudos!