Передача закрытия в качестве аргумента метода в Groovy

#grails #groovy #arguments #closures

Вопрос:

Я пишу службу в Grails 3.

Допустим, я написал подобный метод для «постсервиса»

По умолчанию он должен сортировать категории по их идентификатору.

 List<Category> getCategories(List<Post> posts) {
    List<Category> categories = ... // logic to get categories
    categories.sort { it.id }
    return categories
}
 

Что, если бы я хотел добавить гибкость для сортировки. Например, позже мы хотим вместо этого отсортировать по годам.

Я хочу добавить закрытие сортировки в качестве необязательного аргумента. Я попробовал это.

 List<Category> getCategories(List<Post> posts, Closure sortClosure = null) {
    List<Category> categories = ... // logic to get categories
    if (sortClosure == null) {
        categories.sort { it.id }
    } else {
        // Trying to use the sortClosure. Not sure if these will work.
        // sortClosure << categories.sort
        // categories.sort sortClosure
    }
    return categories
}
 

Я пытаюсь запустить метод с закрытием

 List<Category> categories = postsService.getCategories(posts, { it.year })
 

Но я сталкиваюсь с ошибками. Это приводит к внутренней ошибке сервера в этой строке.

 List<Category> categories = postsService.getCategories(posts, { it.year })
 

Класс java.lang.неучтенная ошибка

Сообщение null

Вызвано PostsController$_select_closure5: метод (Ljava/lang/Объект;Ljava/lang/Объект;)V не найден

Что я здесь делаю не так? Могу ли я использовать закрытие таким образом?

Один из ресурсов, на который я смотрел

Комментарии:

1. Можно ли с уверенностью предположить, что вы не получите ошибку выше, если запустите код, как описано выше (с закомментированной логикой сортировки)? Кроме того, всякий раз, когда я вижу этот класс ошибок (L...)V , я перезапускаю приложение, потому что не удалось выполнить горячую перезагрузку кода. Вы можете это исключить?

2. @cfrick Хорошая идея убрать другую логику! Однако вы были правы насчет сбоя горячей перезарядки. Если вы добавите это в качестве ответа, я отмечу его как правильный и отредактирую свой вопрос, чтобы сделать его более полезным для других.