Java8 lambda流删除对象的两个属性中具有max的对象

Java8 lambda流删除对象的两个属性中具有max的对象,lambda,java-8,attributes,max,Lambda,Java 8,Attributes,Max,我有对象列表任何对象都有两个日期属性insertDate和updateDate我需要找到两个属性insertDate和updateDate之间有绝对最大值的对象。 示例(列表的对象具有属性): 因此,箭头指示将被删除的列表对象。 我尝试了不同的方法: 使用流使用排序(…)。反向从insertDate属性和updateDate属性中获取要删除的最大值,然后比较这两个值以找到最大值,并使用结果对象删除,但它太复杂且性能低下 我尝试使用集合的分组方式。。。。但是我找不到一个基于max on two属性

我有对象列表任何对象都有两个日期属性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);
        }
    }