【问题标题】:Getting oldest DateTime in a List?在列表中获取最旧的日期时间?
【发布时间】:2016-04-21 09:27:02
【问题描述】:

我有一个包含 "Birthday". 字段的 Dog Entities 列表

我想在实体类中有一个方法,它只返回列表中最旧的DateTime

我该怎么做?

实体:

@Entity
@Table(name = "DOG")
public class Dog
{

//some other fields

@Column(name = "BIRTHDAY")
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    private DateTime birthday;

列表示例:

private List<Dog> dogList;

【问题讨论】:

  • 实现可比较的接口。覆盖 compareTo 方法。覆盖等于和哈希码。反向排序列表并获取最顶部的元素。
  • 请举例说明
  • @sidgate 这是一个 c# 答案,这是 java
  • @java123999 - 我已经给出了足够的线索。现在不能做作业:P

标签: java list sorting methods collections


【解决方案1】:

在 Java 8 中使用流和 lambda 创建比较器,然后从 Optional 获取生日:

public static DateTime getOldestDogsBirthday(final Collection<? extends Dog> dogs) {
    return dogs.stream().min((d1, d2) -> d1.getBirthday().compareTo(d2.getBirthday())).get().getBirthday();
}

更新:更简洁的示例基于 cmets 中的建议,使用 getBirthday 作为传递给 Comparator.comparing 的方法引用:

return dogs.stream().min(Comparator.comparing(Dog::getBirthday)).get().getBirthday();

【讨论】:

  • 谢谢,如何在方法中返回最早的 DateTime?
  • 不明白为什么有3个.getBirthday方法?
  • @java123999 - 我已经更新以将其包装在一个方法中。对getBirthday 的前两次调用在比较器中,用于进行实际排序。最后一个是从Optional获取生日
  • 比较器可以用stream().min(comparing(Dog::getBirthday))(和Comparator.comparing的静态导入)更简洁地编写。
  • @java123999 - 该方法返回给定集合中最老的狗的生日(日期)
【解决方案2】:

这里是一个没有 lambda 表达式的例子:

public DateTime findOldestDogsBirthday() {
    Collections.sort(dogList, new Comparator<Dog>() {
        @Override
        public int compare(Dog o1, Dog o2) {
            DateTime d1 = o1.getBirthday();
            DateTime d2 = o2.getBirthday();
            return d1.compareTo(d2);
        }
    });
    return !dogList.isEmpty() ? dogList.get(0).getBirthday() : null;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多