如何使用collections.max()编写通用的findMax()方法?

时间:2016-08-18 16:43:04

标签: java generics collections

我正在尝试创建一个通用方法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);
}

1 个答案:

答案 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 ) );