Considering the following implementation of class Dados
, which can have null phone:
public class Dados {
private String telefone;
public Dados(String telefone) {
this.telefone = telefone;
}
public Optional<String> getTelefone() {
return Optional.ofNullable(telefone);
}
}
And the following implementation of class Pessoa
, which can have all null fields:
public class Pessoa {
private String nome;
private Dados dados;
public Pessoa(String nome, Dados dados) {
this.nome = nome;
this.dados = dados;
}
public Optional<String> getNome() {
return Optional.ofNullable(nome);
}
public Optional<Dados> getDados() {
return Optional.ofNullable(dados);
}
}
We can guarantee that none of the following will generate a NullPointerException
.
Invoke toString in a variable that can be null
Optional<PessoaEncontrada> pessoaNull = Optional.ofNullable(null);
pessoaNull.ifPresent(p -> {
// Executado somente se pessoa nao for null
System.out.println(p.toString());
});
Optional<PessoaEncontrada> pessoaNonNull = Optional.of(new PessoaEncontrada(null, null));
pessoaNonNull.ifPresent(p -> {
// Executado somente se pessoa nao for null
System.out.println(p.toString());
});
Print the name of a person, all in the upper case, where the person and name can be null
Optional<PessoaEncontrada> pessoa2Null = Optional.ofNullable(null);
pessoa2Null.flatMap(PessoaEncontrada::getNome)
.ifPresent(nome -> {
// Executado somente se pessoa e nome nao forem null
System.out.println(nome.toUpperCase());
});
Optional<PessoaEncontrada> pessoa2NonNullNomeNull = Optional.of(new PessoaEncontrada(null, null));
pessoa2NonNullNomeNull.flatMap(PessoaEncontrada::getNome)
.ifPresent(nome -> {
// Executado somente se pessoa e nome nao forem null
System.out.println(nome.toUpperCase());
});
Optional<PessoaEncontrada> pessoa2NonNullNomeNonNull = Optional.of(new PessoaEncontrada("fulano", null));
pessoa2NonNullNomeNonNull.flatMap(PessoaEncontrada::getNome)
.ifPresent(nome -> {
// Executado somente se pessoa e nome nao forem null
System.out.println(nome.toUpperCase());
});
To print a person's phone, which person, data, and phone may be null
Optional<PessoaEncontrada> dadosPessoaNull = Optional.ofNullable(null);
dadosPessoaNull.flatMap(PessoaEncontrada::getDados)
.flatMap(Dados::getTelefone)
.ifPresent(tel -> {
// Executado somente se pessoa, dados e telefone nao forem null
System.out.println(tel.toUpperCase());
});
Optional<PessoaEncontrada> dadosNull = Optional.of(new PessoaEncontrada(null, null));
dadosNull.flatMap(PessoaEncontrada::getDados)
.flatMap(Dados::getTelefone)
.ifPresent(tel -> {
// Executado somente se pessoa, dados e telefone nao forem null
System.out.println(tel.toUpperCase());
});
Optional<PessoaEncontrada> dadosNonNullTelNull = Optional.of(new PessoaEncontrada("hello", new Dados(null)));
dadosNonNullTelNull.flatMap(PessoaEncontrada::getDados)
.flatMap(Dados::getTelefone)
.ifPresent(tel -> {
// Executado somente se pessoa, dados e telefone nao forem null
System.out.println(tel.toUpperCase());
});
Optional<PessoaEncontrada> dadosNonNullTelNonNull = Optional.of(new PessoaEncontrada("hello", new Dados("1122")));
dadosNonNullTelNonNull.flatMap(PessoaEncontrada::getDados)
.flatMap(Dados::getTelefone)
.ifPresent(tel -> {
// Executado somente se pessoa, dados e telefone nao forem null
System.out.println(tel.toUpperCase());
});
In your case, changing the getters of classes to return Optionals, you could change the following line:
pessoa.setNome(pessoaEncontrada.getDados().getCabecalho().getNome());
For something like:
pessoaEncontrada.getDados()
.flatMap(Dados::getCabecalho)
.flatMap(Cabecalho::getNome)
.ifPresent(pessoa::setNome);