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.