Grails 无法比较java.util.ArrayList和java.lang.Integer

Grails 无法比较java.util.ArrayList和java.lang.Integer,grails,collections,groovy,Grails,Collections,Groovy,我正在尝试筛选位置对象列表,以获取筛选后的对象列表 def result= ports?.locations?.findAll { it.numberOfParkingSlots > 0 } 但我有以下例外: Cannot compare java.util.ArrayList with value '[0, 3]' and java.lang.Integer with value '0'. Stacktrace follows: Message: Cannot

我正在尝试筛选位置对象列表,以获取筛选后的对象列表

   def result= ports?.locations?.findAll { 

        it.numberOfParkingSlots > 0
}
但我有以下例外:

Cannot compare java.util.ArrayList with value '[0, 3]' and java.lang.Integer with value '0'. Stacktrace follows:
Message: Cannot compare java.util.ArrayList with value '[0, 3]' and java.lang.Integer with value '0'
这段代码怎么了?

为什么不使用isEmpty()


或者只是使用groovy truth

def result= ports?.locations?.findAll { it.numberOfParkingSlots }

按照共享的代码,您可以尝试将toInteger()方法添加到numberOfParkingSlots属性中

像这样的

def result= ports?.locations?.findAll { 
    it.numberOfParkingSlots.toInteger() > 0
}

我没有尝试过这个,一些建议的选项是合理的,我希望它能帮助您

您的
端口
变量听起来像一个列表,
位置
。当对一个列表调用getter时,Groovy执行一个列表解包,结果看起来像一个collect:来自所有对象的属性都放在一个列表中,因此,您的错误。我通过以下方式再现了您的错误:

class Port { 
    List<Location> locations = [] 
}

class Location { 
    int numberOfParkingSlots 
}

ports = [
    new Port(locations: [ 
        new Location(numberOfParkingSlots: 0), 
        new Location(numberOfParkingSlots: 3) ]),
    new Port(locations: [ new Location(numberOfParkingSlots: 1) ]),
]

ports?.locations?.findAll { 
  it.numberOfParkingSlots > 0 
}
我想这里是这样的

问题是,
ports.location
获得了一个列表,而在
findAll
中,
it
是一个位置列表。一种解决方案是在调用
findAll
之前将列表展平():

def locations = ports?.locations.flatten().findAll {
  it.numberOfParkingSlots > 0
}

assert locations[0].numberOfParkingSlots == 3
assert locations[1].numberOfParkingSlots == 1

numberOfParkingSlots.size()>0
?看起来变量numberOfParkingSlots是ArrayList。您想如何将其与单个整数进行比较?不,它是一个整数,位于Parkingslots的numbers中;根据您的代码片段,它不是整数
无法将java.util.ArrayList与值“[0,3]”和java.lang.integer与值“0”进行比较。
。它清楚地说明了它。numberOfParkingSlots是一个数组列表,而不是一个整数。除非此异常与linenumberOfParkingSlots是整数而不是arraylist无关
Caught: groovy.lang.GroovyRuntimeException: 
    Cannot compare java.util.ArrayList with value '[0, 3]' and 
    java.lang.Integer with value '0'
def locations = ports?.locations.flatten().findAll {
  it.numberOfParkingSlots > 0
}

assert locations[0].numberOfParkingSlots == 3
assert locations[1].numberOfParkingSlots == 1