Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从日期列表中获取与特定日期最近的日期?_Java_Java 8 - Fatal编程技术网

Java 从日期列表中获取与特定日期最近的日期?

Java 从日期列表中获取与特定日期最近的日期?,java,java-8,Java,Java 8,临时类中有两个日期字段,分别是validFromDate和asOfDate。我随身带着一张单子。对于validFromDate最接近asOfDate的记录,我需要将作为类属性之一的标志设置为true 前 列表{ Temp1: asOfDate:2018-01-04 有效期:2018-01-01 第二阶段: asOfDate:2018-01-04 有效期:2018-01-02 第三阶段: asOfDate:2018-01-04 有效期:2018-01-03 } o/p应为Temp3,因为该有效起

临时类中有两个日期字段,分别是validFromDate和asOfDate。我随身带着一张单子。对于validFromDate最接近asOfDate的记录,我需要将作为类属性之一的标志设置为true

列表{
Temp1:
asOfDate:2018-01-04
有效期:2018-01-01
第二阶段:
asOfDate:2018-01-04
有效期:2018-01-02
第三阶段:
asOfDate:2018-01-04
有效期:2018-01-03
}
o/p应为Temp3,因为该有效起始日期最接近A截止日期。我将为此Temp2将标志设置为true


如何使用Java 8 streams实现这一点?

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

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));
这假设您的日期是旧学校的Java8之前的
Java.util.Date
class。否则,我的代码将不得不更改。这还假设您可以更改列表的顺序

下面的演示链接显示了上述lambda排序实际上在一小部分样本数据上起作用

编辑:

如果不想更改原始列表,而只想更新单个匹配的
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);
List copy=newarraylist(列表);
//根据上述文件对副本进行排序
//然后更新原始列表
Temp match=copy.get(0);
int index=list.indexOf(匹配);
list.get(index).setFlag(true);

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

Optional<MyClass> shortestDate = myList.stream()
    .min(
        Comparator.comparingLong(
            item -> ChronoUnit.DAYS.between(item.asOfDate(), item.validFrom())
        )
    );
可选shortestDate=myList.stream()
闵先生(
比较器(
item->ChronoUnit.DAYS.between(item.asOfDate(),item.validFrom())
)
);

最后一个应该是
Temp3
?您尝试过任何代码吗?private Limit getClosestApplicableLimit(List limitList,LocalDate asOfDate){LocalDate currentlnearestdate=null;for(Limit Limit Limit:limitList){if(Limit.getValidFrom().isBefore(asOfDate)&(currentlinearestdate==null | | Limit.getValidFrom()).isAfter(currentNearestDate)){currentNearestDate=limit.getValidFrom();applicatableLimit=limit;}}}返回applicatableLimit;}我尝试了上面的代码。但是我想知道如何在java streamsCan中更新上述代码中的字段值,并返回列表而不是单个字段object@Sahil列表将包含什么?输入:列表:{temp1,validFrom,asOfDate,applicative}…应将最近的validFrom日期的applicative标志更新为true,否则为false。最后,应根据上述情况使用适用的标志true或false更新列表logic@Sahil您没有意义,您想根据差异对
列表进行
排序
。@Sahil在这种情况下,您需要先排序,然后更新标志:
列表结果=test.stream().sorted(Comparator.comparingLong(x->ChronoUnit.DAYS.between(x.asOfDate,x.validFrom)).collect(collector.toList());Spliterator sp=result.stream().Spliterator();sp.tryAdvance(x->x.setWhatEverFlag(true));sp.forEachRemaining(x->x.setWhatEverFlar(false));
  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)));
Optional<MyClass> shortestDate = myList.stream()
    .min(
        Comparator.comparingLong(
            item -> ChronoUnit.DAYS.between(item.asOfDate(), item.validFrom())
        )
    );