How to find Max Date in List<Object>?

前端 未结 6 2231
被撕碎了的回忆
被撕碎了的回忆 2020-12-23 19:13

Consider a class User

public class User{
  int userId;
  String name;
  Date date;
}

Now I have a List

6条回答
  •  难免孤独
    2020-12-23 19:34

    A small improvement from the accepted answer is to do the null check and also get full object.

    public class DateComparator {
    
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    
        List employees = new ArrayList<>();
        employees.add(new Employee(1, "name1", addDays(new Date(), 1)));
        employees.add(new Employee(2, "name2", addDays(new Date(), 3)));
        employees.add(new Employee(3, "name3", addDays(new Date(), 6)));
        employees.add(new Employee(4, "name4", null));
        employees.add(new Employee(5, "name5", addDays(new Date(), 4)));
        employees.add(new Employee(6, "name6", addDays(new Date(), 5)));
        System.out.println(employees);
        Date maxDate = employees.stream().filter(emp -> emp.getJoiningDate() != null).map(Employee::getJoiningDate).max(Date::compareTo).get();
        System.out.println(format.format(maxDate));
        //Comparator comparator = (p1, p2) -> p1.getJoiningDate().compareTo(p2.getJoiningDate());
        Comparator comparator = Comparator.comparing(Employee::getJoiningDate);
        Employee maxDatedEmploye = employees.stream().filter(emp -> emp.getJoiningDate() != null).max(comparator).get();
        System.out.println(" maxDatedEmploye : " + maxDatedEmploye);
    
        Employee minDatedEmployee = employees.stream().filter(emp -> emp.getJoiningDate() != null).min(comparator).get();
        System.out.println(" minDatedEmployee : " + minDatedEmployee);
    
    }
    
    public static Date addDays(Date date, int days) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE, days); // minus number would decrement the days
        return cal.getTime();
    }
    }
    

    You would get below results :

     [Employee [empId=1, empName=name1, joiningDate=Wed Mar 21 13:33:09 EDT 2018],
    Employee [empId=2, empName=name2, joiningDate=Fri Mar 23 13:33:09 EDT 2018],
    Employee [empId=3, empName=name3, joiningDate=Mon Mar 26 13:33:09 EDT 2018],
    Employee [empId=4, empName=name4, joiningDate=null],
    Employee [empId=5, empName=name5, joiningDate=Sat Mar 24 13:33:09 EDT 2018],
    Employee [empId=6, empName=name6, joiningDate=Sun Mar 25 13:33:09 EDT 2018]
    ]
    2018-03-26
     maxDatedEmploye : Employee [empId=3, empName=name3, joiningDate=Mon Mar 26 13:33:09 EDT 2018]
    
     minDatedEmployee : Employee [empId=1, empName=name1, joiningDate=Wed Mar 21 13:33:09 EDT 2018]
    

    Update : What if list itself is empty ?

            Date maxDate = employees.stream().filter(emp -> emp.getJoiningDate() != null).map(Employee::getJoiningDate).max(Date::compareTo).orElse(new Date());
        System.out.println(format.format(maxDate));
        Comparator comparator = Comparator.comparing(Employee::getJoiningDate);
        Employee maxDatedEmploye = employees.stream().filter(emp -> emp.getJoiningDate() != null).max(comparator).orElse(null);
        System.out.println(" maxDatedEmploye : " + maxDatedEmploye);
    

提交回复
热议问题