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