在一组对象中查找最新日期

Finding the latest dates in a set of objects

我希望通过比较日期数据类型的出生日期来从一组中找到日期最近的人。这是我做的一个实验。


public class Person {
    public String name;
    public Date birth;

    public Person(String name, Date birth) {
        this.name = name;
        this.birth = birth;
    }
}

和一个主要 class:

    public static void main(String[] args) throws ParseException {

        Person p1 = new Person("Bill", new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00"));
        Person p2 = new Person("Ray", new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2014-01-12 00:00:00"));
        Person p3 = new Person("Mike", new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00"));
        Person p4 = new Person("Kate", new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2001-01-01 00:00:00"));

        Set<Person> s = new HashSet<>();
        s.add(p1);
        s.add(p2);
        s.add(p3);
        s.add(p4);

        Person temp = p1;

        for (Person i : s) {

            if (temp.birth.compareTo(i.birth) < 0) {
                temp = i;
            }
        }

        System.out.println(temp.name + " " + temp.birth);
    }
}

它现在工作正常,但如果我不等于 temp = p1(例如 Person temp = null),它就不会工作。有没有 不使用额外变量的更好方法?也许有流?谢谢

您可以使用带有 reduce 的流,如下所示:

Person person = s.stream()
        .reduce((youngest, current) -> youngest.birth.compareTo(current.birth) < 0 ? current : youngest)
        .orElseThrow();

System.out.println(person.name + " " + person.birth);

你的解决方案工作得很好,如果不需要必须改变它就保留它。

但出于教育目的,让我们将其分解并尝试用流表达您要求的相同行为。 你想找到最新的日期......或者换句话说就是集合的最大值。幸运的是 java 流公开了这样一个方法 Stream#max(Comparator)

SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss" );
Person p1 = new Person( "Bill", dateFormat.parse( "2011-01-01 00:00:00" ) );
Person p2 = new Person( "Ray", dateFormat.parse( "2014-01-12 00:00:00" ) );
Person p3 = new Person( "Mike", dateFormat.parse( "2011-01-01 00:00:00" ) );
Person p4 = new Person( "Kate", dateFormat.parse( "2001-01-01 00:00:00" ) );

Person max = Stream.of( p1, p2, p3, p4 ).max( Comparator.comparing( Person::getDate ) ).orElseThrow();

System.out.println( max ); // Prints Person{name='Ray', date=Sun Jan 12 00:00:00 CET 2014} at least with the toString() method of my dummy class.