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.