Groovy:从列表中删除和对象本身?

时间:2010-10-14 23:46:53

标签: arrays list groovy

当我发现特定对象隐私时,我正试图从列表中删除对象 对当前用户是私有的

     books.eachWithIndex{ obj, i ->

        if((obj.book.private).equals(true)){

          def status = bookService.getBookStatus(obj.book)

          if(!status){
               books.remove(i)
          }
        }
     }

尝试删除对象时抛出错误

错误errors.GrailsExceptionResolver - null java.util.ConcurrentModificationException

问:有没有办法从列表中删除对象 或者你是否必须单独存储索引值并从每个循环外部删除对象?

3 个答案:

答案 0 :(得分:7)

更实用的方法可能有所帮助:

def publicBooks = books.findAll { obj ->
    !obj.book.isPrivate() || bookService.getBookStatus(obj.book) 
} 

请注意,findAll()会返回 new 集合,而不是修改现有集合。

答案 1 :(得分:2)

有一个迭代器有一个.remove()方法,但我不知道该功能是否已被翻译成groovyesque。它不适用于Java的增强功能。

尝试手动迭代它(使用迭代器,正常的旧式Java样式for循环)并使用iterator.remove()...除非Groovy为您提供了对迭代器的访问,否则它是唯一的方法在你迭代的时候去做。

答案 2 :(得分:0)

hibernate filters plugin就是为这种情况而创建的。我已经在我们当前的项目中使用它来进行这种过滤。