如何在List <Object>中找到Max Date?

use*_*484 43 java collections

考虑一堂课 User

public class User{
  int userId;
  String name;
  Date date;
}
Run Code Online (Sandbox Code Playgroud)

现在我List<User>的大小为20,如何在不使用手动迭代器的情况下在列表中找到最大日期

ass*_*ias 106

由于您要求使用lambdas,因此可以在Java 8中使用以下语法:

Date maxDate = list.stream().map(u -> u.date).max(Date::compareTo).get();
Run Code Online (Sandbox Code Playgroud)

或者,如果你有一个吸气剂的日期:

Date maxDate = list.stream().map(User::getDate).max(Date::compareTo).get();
Run Code Online (Sandbox Code Playgroud)

  • 我通过搜索类似的问题找到了这个,但在您的示例中我需要具有最大日期的用户.对于这种情况,还有另一个好处:`Optional <User> user = users.stream().max(Comparator.comparing(User :: getDate));` (11认同)
  • 如果您想要具有最大日期的对象而不仅仅是日期本身,您可以这样做:`User user = Collections.max(list, Comparator.comparing(User::getDate))` (6认同)
  • 使用 orElse(null) 然后使用 .get(); 是一种更安全的方法。 (4认同)

小智 6

LocalDate maxDate = dates.stream()
                            .max( Comparator.comparing( LocalDate::toEpochDay ) )
                            .get();

LocalDate minDate = dates.stream()
                            .min( Comparator.comparing( LocalDate::toEpochDay ) )
                            .get();
Run Code Online (Sandbox Code Playgroud)


gia*_*kis 5

Comparator<User> cmp = new Comparator<User>() {
    @Override
    public int compare(User user1, User user2) {
        return user1.date.compareTo(user2.date);
    }
};

Collections.max(list, cmp);
Run Code Online (Sandbox Code Playgroud)


Jaj*_*rla 5

从接受的答案中得到的一个小改进是进行了空检查,并获得了完整的对象。

public class DateComparator {

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

    List<Employee> 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<Employee> comparator = (p1, p2) -> p1.getJoiningDate().compareTo(p2.getJoiningDate());
    Comparator<Employee> 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();
}
}
Run Code Online (Sandbox Code Playgroud)

您将获得以下结果:

 [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]
Run Code Online (Sandbox Code Playgroud)

更新:如果列表本身为空怎么办?

        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<Employee> comparator = Comparator.comparing(Employee::getJoiningDate);
    Employee maxDatedEmploye = employees.stream().filter(emp -> emp.getJoiningDate() != null).max(comparator).orElse(null);
    System.out.println(" maxDatedEmploye : " + maxDatedEmploye);
Run Code Online (Sandbox Code Playgroud)