我正在尝试过滤位置对象列表以获取已过滤的对象列表。
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'
此代码有什么问题?
答案 0 :(得分:2)
您的ports
变量听起来像一个列表,locations
也是如此。当在列表上调用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
}
哪个失败了:
Caught: groovy.lang.GroovyRuntimeException:
Cannot compare java.util.ArrayList with value '[0, 3]' and
java.lang.Integer with value '0'
我假设这是这种情况。
问题在于ports.location
正在获取列表列表,而在findAll
内,it
是一个位置列表。在调用flatten()
之前,解决方案是findAll
列表:
def locations = ports?.locations.flatten().findAll {
it.numberOfParkingSlots > 0
}
assert locations[0].numberOfParkingSlots == 3
assert locations[1].numberOfParkingSlots == 1
答案 1 :(得分:0)
为什么不使用isEmpty()?
def result= ports?.locations?.findAll { !it.numberOfParkingSlots.empty }
答案 2 :(得分:0)
或者只是使用groovy真理
def result= ports?.locations?.findAll { it.numberOfParkingSlots }
答案 3 :(得分:0)
按照您分享的代码,您可以尝试将toInteger()方法添加到numberOfParkingSlots 属性
类似这样的事情
def result= ports?.locations?.findAll {
it.numberOfParkingSlots.toInteger() > 0
}
我没有试过这个,一些提议的选项是合理的,我希望它可以帮到你