我正在尝试创建一个通用方法findMax(List list),它接受LocalDate列表或Date类型列表,并返回列表中的最大值。
Collections.max(List LocalDate)和Collections.max(列表日期)都完美无缺,但我不知道如何让它返回正确的类型。
不要真正理解比较器在Java中是如何工作的。
以下是我的尝试
static List<LocalDate> localDateList = new ArrayList<LocalDate>();
static List<Date> dateList = new ArrayList<Date>();
private <T> T findMax(List<T> list) {
return Collections.max(list);
}
public static void main(String[] args) throws ParseException, SQLException, JsonProcessingException {
localDateList.add(new Date(11 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
localDateList.add(new Date(22 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
localDateList.add(new Date(3 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
localDateList.add(new Date(14 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
localDateList.add(new Date(65 * 86400000).toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
dateList.add(new Date(11 * 86400000));
dateList.add(new Date(22 * 86400000));
dateList.add(new Date(3 * 86400000));
dateList.add(new Date(14 * 86400000));
dateList.add(new Date(65 * 86400000));
System.out.println(Collections.max(localDateList));
System.out.println(Collections.max(dateList));
System.out.println(findMax(localDateList));
System.out.println(findMax(dateList));
}
编辑: 通过改变
来实现它private <T> T findMax(List<T> list) {
return Collections.max(list);
}
到
private <T extends Object & Comparable<? super T>> T findMax(List<T> list) {
return Collections.max(list);
}
答案 0 :(得分:4)
Collections.max()
无需编写findMax
方法。 Collections.max
已经为您做到了。
List<LocalDate> localDates = new ArrayList<> ( 3 );
LocalDate today = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );
localDates.add ( today );
localDates.add ( today.plusDays ( 2 ) );
localDates.add ( today.minusDays ( 4 ) );
LocalDate max = Collections.max ( localDates );
转储到控制台。
System.out.println ( "localDates: " + localDates + " | max: " + max );
localDates:[2016-08-18,2016-08-20,2016-08-14] |最大:2016-08-20
任何实现Comparable
接口的类都必须实现compareTo
方法。该方法必须返回负整数,零或正整数,因为此对象小于,等于或大于同一类型的另一个对象。
LocalDate
类已实现此compareTo
方法。
Collections.max
方法循环集合的元素,例如List
,并调用每个对象的compareTo
方法。所有这些都是代表您完成的,以减轻您编写此类代码的繁琐工作。
评论表明,问题实际上更多地是关于Java Generics的比较。
以下是实施findMax
方法的示例。我在OpenJDK项目中使用了Collections.max
source code for Java 8的示例。
正如我上面所说的那样,仅仅将呼叫包裹到Collections.max
是没有用的。但它确实是使用泛型的一个很好的实验例子。
public <T extends Object & Comparable<? super T>> T findMax ( Collection<? extends T> coll ) {
T maximum = Collections.max ( coll );
return maximum;
}
调用该方法并传递上面显示的localDates
集合。
System.out.println ( "findMax: " + this.findMax ( localDates ) );