带有闭包和空安全检查的Groovy集合排序导致异常

带有闭包和空安全检查的Groovy集合排序导致异常,groovy,Groovy,我的代码中有如下语句: otherParents.sort{-it.parent.lastUpdateDate.time}.each{ // ... } 有时,lastUpdateDate将为空,并导致异常 我是groovy的新手,我尝试过问号之类的东西 otherParents.sort { -it.parent?.lastUpdateDate?.time }.each { // ... } 但是这也不起作用有两种方法可以解决这个问题。如果要保留带有nulldate的条目,则必须传递表示比

我的代码中有如下语句:

otherParents.sort{-it.parent.lastUpdateDate.time}.each{
// ...
}
有时,
lastUpdateDate
将为空,并导致异常

我是groovy的新手,我尝试过问号之类的东西

otherParents.sort { -it.parent?.lastUpdateDate?.time }.each {
// ...
}

但是这也不起作用

有两种方法可以解决这个问题。如果要保留带有
null
date的条目,则必须传递表示比较器的闭包,如下所示:

otherParents.sort { a,b -> b.parent.lastUpdatedDate?.time <=> a.parent.lastUpdatedDate?.time }.each {
    println it
}
唯一的区别是,第二个示例将只对具有非null last Update的条目列表进行排序

在下面,您可以找到一个示例及其产生的输出:

import java.text.SimpleDateFormat

def date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")

def otherParents = [
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:00")]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:01")]],
        [parent: [lastUpdatedDate: null]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:02")]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:03")]],
        [parent: [lastUpdatedDate: null]],
        [parent: [lastUpdatedDate: null]]
]

otherParents.sort { a,b -> b.parent.lastUpdatedDate?.time <=> a.parent.lastUpdatedDate?.time }.each {
    println it
}

println "----"

otherParents.findAll { it.parent.lastUpdatedDate != null }.sort { -it.parent.lastUpdatedDate.time }.each {
    println it
}

你确定在添加后?。运算符由于lastUpdateTime为null而失败。也可能是其他原因。是的,在这种情况下失败,因为
negative()
函数不能应用于
null
值。@SomBhattacharyya,是的,错误消息是相同的。
import java.text.SimpleDateFormat

def date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")

def otherParents = [
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:00")]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:01")]],
        [parent: [lastUpdatedDate: null]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:02")]],
        [parent: [lastUpdatedDate: date.parse("2018-10-26T10:00:03")]],
        [parent: [lastUpdatedDate: null]],
        [parent: [lastUpdatedDate: null]]
]

otherParents.sort { a,b -> b.parent.lastUpdatedDate?.time <=> a.parent.lastUpdatedDate?.time }.each {
    println it
}

println "----"

otherParents.findAll { it.parent.lastUpdatedDate != null }.sort { -it.parent.lastUpdatedDate.time }.each {
    println it
}
[parent:[lastUpdatedDate:Fri Oct 26 10:00:03 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:02 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:01 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:00 CEST 2018]]
[parent:[lastUpdatedDate:null]]
[parent:[lastUpdatedDate:null]]
[parent:[lastUpdatedDate:null]]
----
[parent:[lastUpdatedDate:Fri Oct 26 10:00:03 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:02 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:01 CEST 2018]]
[parent:[lastUpdatedDate:Fri Oct 26 10:00:00 CEST 2018]]