从日期列表中获取最接近的日期?

时间:2018-08-01 13:36:42

标签: java java-8

我在Temp类中有两个日期字段,分别是validFromDate和asOfDate。我有清单。我需要将标志whihc是其validFromDate最接近asOfDate的记录的类属性之一设置为true

例如

List<temp> {
    Temp1:
        asOfDate: 2018-01-04
        validFrom: 2018-01-01
    Temp2:
        asOfDate: 2018-01-04
        validFrom: 2018-01-02
    Temp3:
        asOfDate: 2018-01-04
        validFrom: 2018-01-03
}

o / p应该为Temp3,因为此validFrom最接近asOfdate。我将为此Temp2将标志设置为true

如何使用Java 8流实现这一目标?

3 个答案:

答案 0 :(得分:2)

  temp.stream()
      .map(x -> new SimpleEntry<>(x, ChronoUnit.DAYS.between(x.getAsOfDate(), x.getValidFrom())))
      .min(Comparator.comparingLong(Entry::getValue))
      .map(Entry::getKey)
      .orElse(...);

或更简单:

test.stream()
    .min(Comparator.comparingLong(x -> ChronoUnit.DAYS.between(x.asOfDate , x.validFrom)));

答案 1 :(得分:1)

您可以使用ChronoUnit.DAYS.between计算日期之间的天数,然后使用Stream.min获得最小值:

Optional<MyClass> shortestDate = myList.stream()
    .min(
        Comparator.comparingLong(
            item -> ChronoUnit.DAYS.between(item.asOfDate(), item.validFrom())
        )
    );

答案 2 :(得分:0)

我们可以尝试根据asOfDatevalidFrom日期之间的绝对差对列表进行排序,然后从排序后的列表中获取第一个元素。像这样:

list.sort((Temp t1, Temp t2)
    ->Long.compare(Math.abs(t1.getAsOfDate().getTime() - t1.getValidFrom().getTime()),
        Math.abs(t2.getAsOfDate().getTime() - t2.getValidFrom().getTime())));
System.out.println(list.get(0));

这假设您的日期是Java 8 java.util.Date之前的旧班。如果没有,我的代码将不得不更改。这还假定您可以更改列表的顺序。

跟随下面的演示链接,该链接显示上述lambda排序实际上适用于一小组样本数据。

Demo

编辑:

如果您不想更改原始列表,而只想更新单个匹配的Temp元素,则可以制作列表的副本,然后对副本进行排序:

List<Temp> copy = new ArrayList<>(list);
// sort copy, per above
// then update the original list
Temp match = copy.get(0);
int index = list.indexOf(match);
list.get(index).setFlag(true);