Java比较器用于比较两个LocalDateTime对象的方法

5
一个叫做MyCustomClass的自定义类有一个属性,它是joda的LocalDateTime。我需要创建一个java.util.Comparator类来比较MyCustomClass的实例,通过它们的TimeStamp属性,该属性的类型为LocalDateTime。我已经阅读了几篇文章(包括这篇),并尝试了所有方法,但答案中展示的所有方法似乎都不奏效。例如,以下几种方法会导致编译错误:
import java.time.temporal.ChronoUnit;
import java.util.Comparator;

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Period;

import my.app.model.MyCustomClass;

public class MyCustomClassComparator implements Comparator<MyCustomClass>{
    public int compare(MyCustomClass mcc1, MyCustomClass mcc2) {
        //this first attempt throws a return type error for the method.
        return Period.fieldDifference(mcc2.getTimestamp(), mcc1.getTimestamp());
        //This next attempt says that LocalDateTimes are not valid arguments
        Duration.between(mcc2.getTimestamp(), mcc1.getTimestamp());
        //The next approach also says LocalDateTimes are not valid arguments.
        DateTime.parse(mcc2.getTimestamp()), mcc1.getTimestamp()).getSeconds();
        //This boilerplate approach says the minus sign is not valid for LocalDateTime
        return mcc1.getTimestamp() - mcc2.getTimestamp();
    }
}

我打算在代码的其他地方使用它,比如:

List<MyCustomClass> mccs = new ArrayList<MyCustomClass>();
// Sort by time stamp:
Collections.sort(mccs, new MyCustomClassComparator());

如何编写一个Comparator类,以基于它们的Joda LocalDateTime属性比较MyCustomClass实例?


3
LocalDateTime 已经实现了 Comparable 接口,你可以直接使用 mcc1.compareTo(mcc2) 进行比较。 - MadProgrammer
或者干脆不使用Comparator... - MadProgrammer
@MadProgrammer 注意:只有当MyCustomClass实现了相同比较的Comparable<MyCustomClass>接口时,才能摆脱Comparator - Andreas
@Andreas 不确定我理解了。只有在默认实现的Comparable不是你想要的情况下才需要一个Comparator,但我看不到OP在比较方面做出任何特殊的事情。 - MadProgrammer
@Andreas 啊啊啊...那我们需要更多的信息 ;) - MadProgrammer
显示剩余2条评论
3个回答

12

如果你只需要比较器实例:

Iłya Bursov 的回答类似,因为 LocalDateTime 实现了 Comparable 接口,所以可以使用 Comparator.comparing 方法。

Comparator.comparing(MyCustomClass::getTimestamp)

5

LocalDateTime 实现了 comparable 接口,所以您可以实现类似于以下的比较器:

public class MyCustomClassComparator implements Comparator<MyCustomClass> {
    @Override
    public int compare(final MyCustomClass mcc1, final MyCustomClass mcc2) {
        return mcc1.getTimestamp().compareTo(mcc2.getTimestamp());
    }
}

2
考虑到Comparator是一个函数式接口,我们可以使用单个lambda表达式来实现它。
Comparator<LocalDateTime> localDateTimeComparator = (o1, o2) -> o1.compareTo(o2);

//Then use the comparator as always....
LocalDateTime minDate = dates.stream()
                             .min(localDateTimeComparator)
                             .orElseThrow(Assertion::Error)
                   

为了重复使用,静态实例可能会有帮助。
//interfaces are "more static" than classes with "static members" ;-)
public interface MyDateUtils { 

   Comparator<LocalDateTime> localDateTimeComparator = (o1, o2) -> o1.compareTo(o2);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接