Tengo la lista de empleados, estoy tratando de encontrar el Employee con la última fecha de incorporación. Esto es lo que he implementado hasta ahora.

Empleada:

package com;

public class Employee {
    private String accountNumber;
    private String joiningdate;

    public Employee(String accountNumber, String joiningdate) {
        super();
        this.accountNumber = accountNumber;
        this.joiningdate = joiningdate;
    }

    // setters and getters
}

Aplicación:

package com;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class LatestDueDate {

    public static void main(String[] args) throws Exception {
        try {
            SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");

            List < Employee > empList = new ArrayList < > ();

            empList.add(new Employee("1234", "07/11/2020"));
            empList.add(new Employee("1234", "06/12/2020"));

            Employee emp = empList.stream().max(Comparator.comparing(Employee::getJoiningdate)).get();
        } catch (Exception e) {

        }
    }
}

Sé que necesito convertir el formato de fecha de cadena a Fecha.

0
Pavan 25 ago. 2020 a las 18:20

2 respuestas

La mejor respuesta

Está ordenando por la fecha de incorporación del empleado, pero el problema es que su clase Java representa esta fecha usando una cadena de texto , no una clase java.util.Date auténtica o equivalente Java 8. Si debe ceñirse a las fechas del texto, al menos debería representarlas en un formato ISO, p.

List<Employee> empList = new ArrayList<>();

empList.add(new Employee("1234", "2020/11/07"));
empList.add(new Employee("1234", "2020/12/06"));

Employee emp = empList.stream().max(Comparator.comparing(Employee::getJoiningdate)).get();
System.out.println("Latest employee joined on: " + emp.getJoiningDate());

Lo anterior funciona, porque la fecha del texto 2020/12/06 se ordenará después de 2020/11/07. Un mejor enfoque podría ser representar la fecha de unión con un tipo de fecha adecuado o, al menos, convertir las fechas de texto en tipos de fecha reales antes de clasificar a los empleados.

-1
Tim Biegeleisen 25 ago. 2020 a las 15:52

Puede convertir String date en LocalDate y comparar dentro del comparador. Pero le recomiendo que use LocalDate para joiningdate en la clase de Empleado, entonces no necesita analizar la cadena de fecha dentro del comparador hasta la última fecha de unión uno.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
Employee emp = empList.stream()
    .max(Comparator.comparing(e -> LocalDate.parse(e.getJoiningdate(), formatter)))
    .get();

Nota: No use la clase Date antigua, sino use LocalDate de java.time

3
Michael 25 ago. 2020 a las 17:40