使用 Hazelcast jet 根据最大​​日期过滤结果

Filtering the result based on max date using Hazelcast jet

如何根据最大日期筛选 BatchStage 结果。

这是我的代码..

    BatchStage<TestModel> testModel = value.map(model -> JsonUtil.mapFrom(model.getObject_value()))
                .map(json -> new TestModel(json.get("id"), json.get("json_obs")));

这是模型class

public class TestModel implements Serializable {

    private Object key;
    private Object value;
    //getters and setter
    // HashCode and equals method
}

在控制台中,我目前正在获取此输出

TestModel [key=0001, value=[{date=09/03/2021}, {date=10/03/2021}]]
TestModel[key=0002,  value=[{date=09/03/2021}, {date=11/03/2021}]]

现在我只想在值对象中保留最大日期映射

示例:-

TestModel [key=0001, value=[{date=10/03/2021}]]
TestModel[key=0002,  value=[{date=11/03/2021}]]

任何建议都会有所帮助。

你只需要写一个函数,它需要获取日期列表中的最大日期。

而且我想我需要知道“约会对象”的类型... 如果是“java.util.Date”的类型,函数可以这样:

public static Date getMaxDate(List<Date> dates) {
    if (dates.size() == 0) {
        throw new RuntimeException("No date value in list...");
    }
    Date max = dates.get(0);
    for (Date date : dates) {
        //use the implemented compareTo() function
        if (max.compareTo(date) < 0) {
            max = date;
        }
    }
    return max;
}

如果是“java.time.LocalDate”的类型函数可以这样:

public static LocalDate getMaxLocalDate(List<LocalDate> dates) {
    if (dates.size() == 0) {
        throw new RuntimeException("No date value in list...");
    }
    LocalDate max = dates.get(0);
    for (LocalDate date : dates) {
        //use isBefore function
        if (max.isBefore(date)) {
            max = date;
        }
    }
    return max;
}

如果是你自己的类型,定义如下:

public class MyDate {
    public int year;
    public int month;
    public int day;

    public MyDate() {
    }

    public MyDate(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @Override
    public String toString() {
        return "MyDate{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }
}

那么函数可以是这样的:

public static MyDate getMaxMyDate(List<MyDate> dates) {
    if (dates.size() == 0) {
        throw new RuntimeException("No date value in list...");
    }
    MyDate max = dates.get(0);
    LocalDate maxLocalDate = LocalDate.of(max.year, max.month, max.day);
    for (MyDate date : dates) {
        //convert to LocalDate to compare
        LocalDate currentLocalDate = LocalDate.of(date.year, date.month, date.day);
        if (maxLocalDate.isBefore(currentLocalDate)) {
            max = date;
            maxLocalDate = LocalDate.of(max.year, max.month, max.day);
        }
    }
    return max;
}

看来你需要得到一个列表结果,你可以使用List.of(max)得到一个列表结果。