Java 从日期列表中获取与特定日期最近的日期?
临时类中有两个日期字段,分别是validFromDate和asOfDate。我随身带着一张单子。对于validFromDate最接近asOfDate的记录,我需要将作为类属性之一的标志设置为true 前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,因为该有效起
列表{
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())
)
);