Nuestra clase Persona en Java quedaría del siguiente modo:
public class Persona implements Comparable{
public Persona(String _name,
String _apellidos,
boolean _isMan,
LocalDate fechaNacimiento,
String _lugarNacimiento){
nombre=_name;
apellidos=_apellidos;
isMan =_isMan;
nacimiento=fechaNacimiento;
lugarNacimiento=_lugarNacimiento;
}
String nombre;
String apellidos;
LocalDate nacimiento;
String lugarNacimiento;
Boolean isMan;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public LocalDate getNacimiento() {
return nacimiento;
}
public void setNacimiento(LocalDate nacimiento) {
this.nacimiento = nacimiento;
}
public String getLugarNacimiento() {
return lugarNacimiento;
}
public void setLugarNacimiento(String lugarNacimiento) {
this.lugarNacimiento = lugarNacimiento;
}
public Boolean getIsMan() {
return isMan;
}
public void setIsMan(Boolean isMan) {
this.isMan = isMan;
}
public int getEdad(){
LocalDate now= LocalDate.now();
return now.getYear() -
nacimiento.getYear() +
Integer.compare(now.getDayOfYear(), nacimiento.getDayOfYear());
}
@Override
public String toString() {
return "Persona{" + "nombre=" + nombre + ", apellidos=" + apellidos + ", edad= " + getEdad() + "}";
}
public boolean isFrom(String city){
return lugarNacimiento.equals(city);
}
public String getFullName(){
return String.format("%s, %s", getApellidos(), getNombre());
}
@Override
public int compareTo(Persona o) {
return this.apellidos.compareTo(o.apellidos);
}
}
añadimos los elementos a la colección de igual modo, esta vez usando para la fecha la clase LocalDate
static void addPersonas(){
personas.add(new Persona("Joaquin", "Martinez Rus", true,LocalDate.of(1969, 2, 20), "Linares"));
personas.add(new Persona("Vicky", "Diez Calatayud", false,LocalDate.of(1996, 4, 19), "Calatayud"));
personas.add(new Persona("Ana Isabel", "Martinez Baloo", false,LocalDate.of(1998, 10, 20), "Cordoba"));
personas.add(new Persona("Victoria", "Martinez Nurse", false,LocalDate.of(1992, 1, 21), "Cordoba"));
personas.add(new Persona("Ana", "Rus Maria", false,LocalDate.of(1961, 11, 3), "Linares"));
personas.add(new Persona("Manuel", "Bonillo Contador", true,LocalDate.of(1978, 12, 26), "Cordoba"));
personas.add(new Persona("Jose Antonio", "Martinez Arcos", true,LocalDate.of(1974, 9, 4), "Zaragoza"));
personas.add(new Persona("Vicente", "Rodriguez Iglesias", true,LocalDate.of(1981, 11, 8), "Cordoba"));
personas.add(new Persona("Alfonso", "Perez Judicial", true,LocalDate.of(2000, 5, 5), "Linares"));
personas.add(new Persona("Ana", "Martinez Maestre", false,LocalDate.of(2004, 3, 4), "Linares"));
personas.add(new Persona("Magdalena", "Fuentes Cruz", false,LocalDate.of(2002, 7, 11), "Jaen"));
personas.add(new Persona("Jose", "Martinez Cintas", true,LocalDate.of(1981, 6, 21), "Linares"));
personas.add(new Persona("Jose", "Aldea Morata", true,LocalDate.of(1994, 11, 22), "Calatayud"));
personas.add(new Persona("Maria Isabel", "Diez Campieles", false,LocalDate.of(2005, 8, 1), "Calatayud"));
personas.add(new Persona("Maria", "Martinez Adriá", false,LocalDate.of(2001, 10, 22), "Jaen"));
personas.add(new Persona("Pedro José", "Garcia Civil", true,LocalDate.of(1980, 9, 15), "Cordoba"));
personas.add(new Persona("Luis", "Jiloca Diez", true,LocalDate.of(1995, 6, 15), "Zaragoza"));
personas.add(new Persona("Juan", "Pintor Escultor", true,LocalDate.of(2000, 10, 22), "Jaen"));
personas.add(new Persona("Juan", "Goran Esteban", true,LocalDate.of(1974, 7, 14), "Jaen"));
personas.add(new Persona("Andrea", "Jiloca Diez", false,LocalDate.of(1999, 9, 21), "Calatayud"));
personas.add(new Persona("Daniel", "Ceular Flower", true,LocalDate.of(1975, 2, 4), "Cordoba"));
}
y pasamos al primer ejemplo aunque lógicamente solo mostraré el método tradicional y la expresión lambda, las cuales fueron incluidas con Java 8.
Ejemplo 1. ¿cual es el promedio de edad de todas las personas nacidas en Calatayud?
Java tiene algunas variaciones con respecto a C#, de modo que para crear una expresión lambda sobre una colección, debemos crear un stream (o iteración) y sobre este con filter hacemos la función where en C# y por último con mapToDouble, convertimos o mejor dicho creamos un stream de objetos tipo Double a los cuales le calculamos el promedio.
static void getAverageAge(String lugarNacimiento){
double suma=0;
double count=0;
for (Persona persona : personas) {
if (persona.getLugarNacimiento().equals(lugarNacimiento)) {
suma += persona.getEdad();
count ++;
}
}
double promedio = suma / count;
System.out.printf("Las personas nacidas en %s tienen un promedio de edad de %s\n", lugarNacimiento, promedio);
}
static void getStreamAverageAge(String lugarNacimiento){
OptionalDouble promedio= personas.
stream().
filter(k->k.isFrom(lugarNacimiento)).
mapToDouble(e->e.getEdad()).
average();
System.out.printf("Las personas nacidas en %s tienen un promedio de edad de %s\n", lugarNacimiento, promedio.getAsDouble());
}
Ejemplo 2. Queremos listar todos los mayores de edad por orden alfabético de los apellidos. En este ejemplo, debemos implementar la interface Comparator incluir el método compareTo y con esto mostramos el código
static void printAdults(){
personas.sort(new Comparator() {
@Override
public int compare(Persona o1, Persona o2) {
return o1.apellidos.compareTo(o2.apellidos);
}
});
for (Persona persona : personas) {
if (persona.getEdad()>17)
{
System.out.println(persona.getFullName());
}
}
}
static void printStreamAdults(){
personas.stream().
filter(p->p.getEdad()>17).
sorted().
forEach(p-> System.out.println(p.getFullName()));
}
y el resultado que debe ser exactemente igual.



