Java8 lambda流删除对象的两个属性中具有max的对象
我有对象列表任何对象都有两个日期属性insertDate和updateDate我需要找到两个属性insertDate和updateDate之间有绝对最大值的对象。 示例(列表的对象具有属性): 因此,箭头指示将被删除的列表对象。 我尝试了不同的方法:Java8 lambda流删除对象的两个属性中具有max的对象,lambda,java-8,attributes,max,Lambda,Java 8,Attributes,Max,我有对象列表任何对象都有两个日期属性insertDate和updateDate我需要找到两个属性insertDate和updateDate之间有绝对最大值的对象。 示例(列表的对象具有属性): 因此,箭头指示将被删除的列表对象。 我尝试了不同的方法: 使用流使用排序(…)。反向从insertDate属性和updateDate属性中获取要删除的最大值,然后比较这两个值以找到最大值,并使用结果对象删除,但它太复杂且性能低下 我尝试使用集合的分组方式。。。。但是我找不到一个基于max on two属性
<强>重要< /强>:考虑我们搜索max的日期属性可以为null
有人能提供性能和优雅的解决方案吗? 这太复杂了,而且我对lambda的反应不是很快 非常感谢您的支持列出元素;
比较器日期比较器=(日期a,日期b)->a==b?0
:a==null-1:b==null?1:a.与(b)相比;
可选的maxElement=elements.stream().max((元素a,元素b)->
日期比较器(
dateComparator.compare(a.insertDate,a.updateDate)>=0?
a、 插入日期:a.updateDate,
dateComparator.compare(b.insertDate,b.updateDate)>=0?
b、 插入日期:b.updateDate);
这里有一种可能性。我用的是日期,不是日期,因为日期已经过时了。应该使用该软件包。为了演示的目的,我更新了我的课程版本。您需要用MyObject
替换类的名称,才能使用您的数据
数据
List<MyObject> list = List.of(
new MyObject("2020-10-11 15:48", "2020-11-11 15:48"),
new MyObject(null, "2019-09-11 15:48"),
new MyObject("2019-10-11 15:48", null),
new MyObject(null, null),
new MyObject("2019-10-11 15:48", "2019-11-11 10:48"));
这张照片
2020-10-11 15:48 2020-11-11 15:48
对于completon,我提供了一个Date
比较器来使用,因为对象中有Date
字段。只需将上一个流中的comp
替换为dateComparator
,它就可以正常工作了
Comparator<MyObject> dateComparator = (a, b) -> Long.compare(
Math.abs(a.getInsertDate().toInstant().toEpochMilli()-
a.getUpdateDate().toInstant().toEpochMilli()),
Math.abs(b.getInsertDate().toInstant().toEpochMilli()-
b.getUpdateDate().toInstant().toEpochMilli()));
你会发布你的尝试吗(代码更容易阅读(大部分)。什么是绝对最大值-是否只检查更新日期最高的行?样本的数据结构是什么?顺便说一句,和之间有很大的区别。也非常感谢
MyObject result = list.stream()
.filter(obj -> obj.getInsertDate() != null
&& obj.getUpdateDate() != null)
.max(comp).orElse(null);
System.out.println(result);
2020-10-11 15:48 2020-11-11 15:48
Comparator<MyObject> dateComparator = (a, b) -> Long.compare(
Math.abs(a.getInsertDate().toInstant().toEpochMilli()-
a.getUpdateDate().toInstant().toEpochMilli()),
Math.abs(b.getInsertDate().toInstant().toEpochMilli()-
b.getUpdateDate().toInstant().toEpochMilli()));
class MyObject {
public LocalDateTime insertDate;
public LocalDateTime updateDate;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public MyObject(String insertDate, String updateDate) {
if (insertDate != null) {
this.insertDate = LocalDateTime.parse(insertDate,dtf);
}
if (updateDate != null) {
this.updateDate = LocalDateTime.parse(updateDate,dtf);
}
}
public LocalDateTime getInsertDate() {
return insertDate;
}
public LocalDateTime getUpdateDate() {
return updateDate;
}
public String toString() {
return insertDate.format(dtf) + " " + updateDate.format(dtf);
}
}