Versão mais elegante desse codigo

FIZ UMA VERDADEIRA GAMBIARRA PARA SABER A IDADE COMPARANDO COM O “PERIOD”

public void buscarContato(String nome) {
        contatos.forEach(action -> {
            Contato contato = (Contato) action;
            if (contato.getNome().equals(nome)) {        //se o nome passaso existir
                String nasc = dataFormatada.format(contato.getDataNasc().getTime());    //variavel recebe a data de nascimento formatada com dateFormat EX:01/01/2018
                String[] nasc1 = nasc.split("/");        //array da data de nascimento separados EX: 01 01 2018
                String[] atual = dataFormatada.format(c1.getTime()).split("/");       //array da data atual tambem separados

                byte idade = (byte) Period.between(LocalDate.of(Integer.parseInt(nasc1[2]), Integer.parseInt(nasc1[1]), Integer.parseInt(nasc1[0])),// data de nascimento da pessoa
                        LocalDate.of(Integer.parseInt(atual[2]), Integer.parseInt(atual[1]), Integer.parseInt(atual[0]))).getYears();// data de nascimento atual
                System.out.println("Nome: " + contato.getNome()
                        + "\nData de nascimento: " + nasc
                        + "\nNúmero: " + contato.getNumero()
                        + "\nIdade: " + idade);
            }
        });
    }

Uma forma:

public void buscarContato(String nome) {
 final int[] atual = vetorStringParaInt(dataFormatada.format(c1.getTime()).split("/")); //array da data atual tambem separados
 contatos.stream().map(Contato.class::cast)
  .filter(c -> c.getNome().equals(nome)) //se o nome passaso existir
  .forEach(c -> {
   String nasc = dataFormatada.format(contato.getDataNasc().getTime()); //variavel recebe a data de nascimento formatada com dateFormat EX:01/01/2018
   int[] nasc1 = vetorStringParaInt(nasc.split("/")); //array da data de nascimento separados EX: 01 01 2018
   // int é melhor
   int idade = (int) Period.between(LocalDate.of(nasc1[2], nasc1[1], nasc1[0]), // data de nascimento da pessoa
    LocalDate.of(atual[2], atual[1], atual[0]).getYears(); // data de nascimento atual
    System.out.println("Nome: " + c.getNome() + "\nData de nascimento: " + nasc + "\nNúmero: " + c.getNumero() + "\nIdade: " + idade);
   }
  });
}
private int[] vetorStringParaInt(String[] string) {
 return new int[] {
  Integer.parseInt(string[0]),
   Integer.parseInt(string[1]),
   Integer.parseInt(string[2])
 };
}

Se existir no máximo um contato com aquele nome:

Optional < Contato > optional = contatos.stream().map(Contato.class::cast)
 .filter(c -> c.getNome().equals(nome))
 .findFirst();

if (optional.isPresent()) {
 Contato c = optional.get();
 /****/
1 curtida

int idade = (int) Period.between(LocalDate.of(nasc1[2], nasc1[1], nasc1[0]);

porque você trocou por INT? é inseguro usar byte? acredito que a idade não passe de 128 e deixa o programa mais leve se tiver muitas linhas como essa. desculpe a ignorância se eu tiver escrevendo besteira.

Em java, fazer operações com bytes pode ser mais trabalhoso para o programa do que para int:

 byte a = 9;
 a = a + (byte) 5;

Observe que é necessário usar cast para fazer 9 + 5 em byte, o java lê números como int ou double e não como outros tipos (tem excessões). Casts costumam deixar o programa mais pesado. Embora byte use menos memoria, não significa que seja mais leve para fazer operações.

Não sei o tipo de dado aquela expressão retorna, vc pode usar o mesmo tipo para evitar o cast.

Acredito que as linhas mais pesada ali são:

Contato contato = (Contato) action;

ou

.map(Contato.class::cast)

pode melhorar definindo o tipo genérico da lista, exemplo:

List<Contato> listaDeContatos = new ArrayList<>();

Dessa forma, não precisará usar cast.

Casts com bytes aumentam as chances de dar erro no programa, portanto é mais seguro usar int.

Só completando, use byte somente quando for armazenar o valor, se for usar para fazer operações, tenha a preferência de usar int.