Considering the following implementation of the class Dados, that may have no 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 class implementation 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 have the guarantee that none of the excerpts below 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 a person’s name, all in high box, and 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());
    });
Print a person’s phone, where person, data and phone can 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, by changing the getters of the 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);
							
							
						 
Using java 8 resources (map,filter), etc...
– laaf