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

时间:2014-06-04 18:21:05

标签: 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 compare java.util.ArrayList with value '[0, 3]' and java.lang.Integer with value '0'

此代码有什么问题?

4 个答案:

答案 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
}

我没有试过这个,一些提议的选项是合理的,我希望它可以帮到你