Groovy: удалить и объект из списка внутри себя? - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь удалить объекты из списка, когда обнаруживает, что конфиденциальность определенных объектов является конфиденциальной для текущего пользователя

     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

Q: есть ли способ удалить объект из списка внутри себя или вам придется отдельно хранить значения индекса и удалять объекты вне каждого цикла

Ответы [ 3 ]

7 голосов
/ 15 октября 2010

Может помочь более функциональный подход:

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

Обратите внимание, что findAll () возвращает новую коллекцию вместо изменения существующей.

2 голосов
/ 15 октября 2010

Есть итератор, у которого есть метод .remove (), но я не знаю, была ли эта функциональность переведена в groovyesque. Он также не работает с расширенными возможностями Java.

Попробуйте выполнить итерацию вручную (с помощью итератора, обычного стиля старой школы Java для цикла) и используйте iterator.remove () ... Если Groovy не предоставил вам доступ к итератору, это единственный способ сделайте это во время итерации.

0 голосов
/ 15 октября 2010

Плагин hibernate * был создан именно для такого сценария. Я использовал его в нашем текущем проекте для такой фильтрации.

...