【问题标题】:Most concise way to get max(A.x) in a Collection<A>在 Collection<A> 中获取 max(A.x) 的最简洁方法
【发布时间】:2014-05-22 10:22:35
【问题描述】:

我有一个使用这些属性定义的类Person

private String name;
private String surname;
private Date birthday;

我想在Collection&lt;Person&gt; 中获得最多的生日。

Java 7 中,没有外部库,我会这样做:

public Date maxAgeJava7(Collection<Person> persons) {
  Date max = null;
  for (Person person : persons) {
    if (max == null || person.getBirthday().after(max)) {
      max = person.getBirthday();
    }
  }
  return max;
}

现在,在 Java 8 中,可以这样写:

public Date maxAgeJava8(Collection<Person> persons) {
  return persons.stream().map(Person::getBirthday).max((Date d1, Date d2)-> d1.compareTo(d2)).get();
}

这要好得多但是我不喜欢这部分:

(Date d1, Date d2)-> d1.compareTo(d2)

作为日期implements Comparable,有没有办法告诉Java 使用compareTo() 方法,而不必显式编写它?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    max 需要 Comparator 作为参数。

    我认为您可以做的最短的事情是使用方法引用调用方法compareTo

    public Date maxAgeJava8(Collection<Person> persons) {
        return persons.stream().map(Person::getBirthday).max(Date::compareTo).get();
    }
    

    另请注意,您不需要使用Stream 来完成此操作。您可以简单地使用 Collections.max 提供自定义比较器:

    public Date maxAgeJava8(Collection<Person> persons) {
        return Collections.max(persons, Comparator.comparing(Person::getBirthday)).getBirthday();
    }
    

    【讨论】:

    • 这很棒 :) 你能解释一下它为什么有效吗? Date::compareTo 是一个方法引用。为什么编译器将其视为比较器?
    • @ArnaudDenoyelle 它之所以有效,是因为方法引用实际上是一个比较器,而不是像 compareTo() 这样的函数调用的结果。更清楚地说:您可以编写 Comparator&lt;Date&gt; comp = Date::compareTo 并将其解析为最大值:max(comp)
    • @ArnaudDenoyelle ifLoop 说明了一切。另请注意,Date::compareTo 的等效 lamdba 是 (Date a, Date b) -&gt; a.compareTo(b),这是您已经完成的。所以你也可以Comparator&lt;Date&gt; comp = (Date a, Date b) -&gt; a.compareTo(b);
    • 如果您需要Comparator 来获取Comparable 对象,您可以使用Comparator.naturalOrder() 来获得一个。因此:return persons.stream().map(Person::getBirthday).max(Comparator.naturalOrder()).get();
    • @ZouZou Date::compareTo 引用了一个接受一个参数的非静态方法。我不明白为什么可以替换 Comparator.compare(T o1, T o2) 这是一个需要 2 个参数的静态方法。 java是否会自动将Date.this.compareTo(b)替换为Comparator.compareTo(this, b)
    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2018-09-24
    • 2016-06-22
    • 2011-01-09
    • 2015-11-29
    相关资源
    最近更新 更多