Lucas, o problema desta solução é que ela não leva em conta o dia e o mês do nascimento. Uma pessoa que nasceu em 01/10/1987 apareceria como se já tivesse 34 anos quando na verdade tem 33 ainda.
Usando LocalDate o mais correto seria assim:
LocalDate dataDeNascimento = LocalDate.of(1987, 10, 1);
long idade = ChronoUnit.YEARS.between(dataDeNascimento, LocalDate.now());
System.out.println(idade);
Mas como ele precisa trabalhar com Date, daria pra fazer assim com a ajuda de Calendar, assim:
try {
SimpleDateFormat format = new SimpleDateFormat("dd/M/yyyy");
Date dataDeNascimento = format.parse("08/09/1987");
long diferenca = new Date().getTime() - dataDeNascimento.getTime();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(diferenca);
System.out.println(calendar.get(Calendar.YEAR) - 1970);
} catch (ParseException e) {
e.printStackTrace();
}
Não é a solução perfeita, pois apesar de hoje ser dia 7, se a pessoa nasceu em 08/09/1987, vai dar que ela já tem 34 anos.
Se vc puder, dá pra respeitar a assinatura do método, recebendo um Date, mas trabalhar com LocalDate internamente, seria algo assim:
private int calcularIdade(Date dataDeNascimento) {
LocalDate data = dataDeNascimento
.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
return (int) ChronoUnit.YEARS.between(data, LocalDate.now());
}
Assim que puder, abandone Date, Calendar e companhia e use a API mais moderna do LocalDate e outros.