How to use Optional.ofNullable () in this example?

0

In this example, how can I use this feature to prevent NullPointerException in get ?

public Pessoa parse()
{
     Pessoa pessoa = new Pessoa();
     RespostaPessoaEncontrada pessoaEncontrada = ObjectMapperFactory.getInstance()
                   .readValue(jsonObject.toString(), RespostaPessoaEncontrada.class);

     pessoa.setNome(pessoaEncontrada.getDados().getCabecalho().getNome());

     pessoa.setCargo(pessoaEncontrada.getDados().getProfissao().getNome());

     pessoa.setIrmao(pessoaEncontrada.getClasse().getFamilia().getIrmao().getNome();

     return pessoa;
}
    
asked by anonymous 01.11.2017 / 12:24

1 answer

1

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);
    
01.11.2017 / 14:21