我在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流实现这一目标?
答案 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)
我们可以尝试根据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));
这假设您的日期是Java 8 java.util.Date
之前的旧班。如果没有,我的代码将不得不更改。这还假定您可以更改列表的顺序。
跟随下面的演示链接,该链接显示上述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);