How do I use Optional.ofNullable() in this example?

Asked

Viewed 2,918 times

0

In this example, how can I use this feature to avoid NullPointerException us 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;
}
  • Using java 8 resources (map,filter), etc...

1 answer

1

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);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.