簡體   English   中英

兩個 LocalDateTimes 的 java 比較器

[英]java comparator for two LocalDateTimes

名為MyCustomClass的自定義類有一個屬性,它是 joda LocalDateTime 我需要創建一個java.util.Comparator類,通過它們的TimeStamp屬性( LocalDateTime類型)比較MyCustomClass的實例。 我已經閱讀了幾篇關於這個(包括這個)的帖子,我已經嘗試了所有的方法,但答案中顯示的方法似乎都不起作用。 例如,以下幾種方法會引發編譯錯誤:

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的實例?

如果您只需要一個比較器實例:

類似於Iłya Bursov的回答,因為 LocalDateTime 實現了可比性,您可以使用Comparator.comparing

Comparator.comparing(MyCustomClass::getTimestamp)

LocalDateTime實現了可比較的接口,因此您可以實現如下比較器:

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

鑒於 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);

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM