Перейти к основному содержимому

Синтаксические конструкции Groovy

Разработчику Архитектору

Синтаксические конструкции Groovy

Ниже — конструкции, которые встречаются в скриптах и прикладном коде чаще, чем "чистый" Java-синтаксис. Пунктуация и кавычки: синтаксис и пунктуация.


Базовый синтаксис

Код ITЗагрузка примера кода…

Разбор:

  • def name = 'Alice' и GString "Hello, $name" — переменные и интерполяция строк.
  • def greet = { who -> ... } — closure; greet('Bob') вызывает его как функцию.
  • [1, 2, 3] и [name: 'John', age: 30] — список и map (ключи без кавычек — идиома Groovy).
  • new File('test.txt').eachLine { line -> ... } — GDK: построчное чтение файла без BufferedReader вручную.
  • try/catch (e) — перехват исключения; e без типа; ${e.message} в GString — свойство Java-исключения.

Класс с main, картой и замыканием — типичный учебный каркас:

Код ITЗагрузка примера кода…

Разбор:

  • def data = [name: 'James', location: 'London'] — литерал Map с символическими ключами.
  • for (e in data) обходит пары ключ–значение; e.key и e.value доступны у элемента итерации.
  • collection.each { println("value ${it}") } — closure с неявным параметром it.
  • static void main(args) — точка входа JVM; args — аргументы командной строки.
  • Точка с запятой в конце строк не обязательна.

JSON


import groovy.json.JsonSlurper
import groovy.json.JsonOutput

def json = '{"name":"Alice","age":25}'
def data = new JsonSlurper().parseText(json)
println data.name // Alice

def out = JsonOutput.toJson([name: 'Bob', age: 30])
println JsonOutput.prettyPrint(out)

Разбор:

  • Фрагмент на groovy показывает рабочий пример: начинается с import groovy.json.JsonSlurper и задает контекст выполнения.
  • Строки import подключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета.
  • Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
  • Поток выполнения линейный: шаги идут последовательно, поэтому итог зависит от порядка операций в блоке.
  • Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.

В крупных сервисах часто оставляют Jackson (Java API), а JsonSlurper — в скриптах и тестах.


XML

def xml = '''
<people>
<person name="John"/>
</people>'''
def root = new XmlSlurper().parseText(xml)
println root.person.@name

def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.html {
head { title 'Page' }
body { h1 'Hello from Groovy!' }
}

Разбор:

  • Фрагмент на groovy показывает рабочий пример: начинается с def xml = ''' и задает контекст выполнения.
  • Ключевые операторы и выражения (def, литералы, вызовы) формируют данные, с которыми работает остальная часть примера.
  • Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
  • Поток выполнения линейный: шаги идут последовательно, поэтому итог зависит от порядка операций в блоке.
  • Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.

Коллекции — collect, findAll, groupBy

def books = [
[title: 'Groovy', active: true],
[title: 'Java', active: false],
[title: 'Spock', active: true]
]
def activeTitles = books.findAll { it.active }.collect { it.title }
def byActive = books.groupBy { it.active }
println activeTitles
println byActive[true]*.title

Разбор:

  • books — список карт (литерал [:] внутри [...]); ключи title, active доступны как it.title, it.active.
  • findAll { it.active } оставляет только записи с active: true.
  • collect { it.title } преобразует каждый элемент в строку заголовка → список ['Groovy', 'Spock'].
  • groupBy { it.active } возвращает Map: ключ true/false, значение — список элементов.
  • byActive[true]*.titlespread *.title: у всех карт в группе взять поле title (короткая запись вместо collect).

Фреймворки и инструменты

НазваниеРольСвязь с Groovy
GradleСборка JVM/AndroidGroovy DSL (и Kotlin DSL) — исполняемые скрипты задач
JenkinsCI/CDPipeline, Job DSL, shared libraries на Groovy
SpockТестыСпецификации given-when-then, моки
GrailsFull-stack вебЯзык приложения — Groovy; стек Spring + Hibernate; с 3.x — Spring Boot
RatpackHTTP-сервисы, веб-APIЛёгкий неблокирующий фреймворк на Groovy
FastJ2D-игры на JVMШаблон на Groovy, Gradle, кроссплатформа
GriffonНастольные приложенияMVC на Groovy, JavaFX/Swing
GebUI-тестыGroovy + WebDriver
Micronaut / QuarkusМикросервисыОпциональная поддержка Groovy; основной язык обычно Java/Kotlin

Groovy как язык расширения платформ

Помимо фреймворков, Groovy встроен в готовые продукты — пользователь пишет скрипты, не меняя ядро на Java:

ПродуктРоль Groovy
JenkinsPipeline, Job DSL, shared libraries, шаги автоматизации
JasperReports / iReportВыражения и дополнительная логика в отчётах
SoapUIТестовые сценарии и assertions для SOAP/REST
GradleСкрипты сборки, кастомные task и плагины

Grails и Spring Boot — не одно и то же

  • Spring Boot — стартовый каркас Spring: вы пишете на Java/Kotlin, конфигурируете beans и REST вручную или через стартеры.
  • Grailsконвенции поверх Spring (раньше — отдельный стек) — доменные классы, GORM, динамические finders (Book.findByTitle(...)), встроенные DSL для constraints. С Grails 3+ под капотом Spring Boot, но модель разработки остаётся "Rails-подобной".

Для нового веб-проекта на JVM чаще выбирают Spring Boot + Java/Kotlin; Groovy там — в тестах (Spock) или сборке (Gradle), а не как основной язык UI.


Сферы применения

  1. Автоматизация — логи, файлы, миграции, админ-скрипты.
  2. Тестирование — Spock, Geb, REST Assured (спецификации на Groovy).
  3. CI/CD — Jenkinsfile, кастомные шаги TeamCity.
  4. Сборка — Gradle, плагины, кастомные task.
  5. КонфигурацияConfigSlurper, Groovy-конфиги Spring (реже XML).
  6. ETL и отчёты — CSV, JSON, XML в скриптах; выражения в JasperReports.
  7. Тестирование API — сценарии в SoapUI и REST Assured на Groovy.

Важные типы рантайма Groovy

Класс / интерфейсНазначение
ClosureЗамыкание; основа each, DSL, Gradle-блоков
GroovyShell, GroovyScriptEngineВыполнение строк и файлов-скриптов
MetaClassДинамическое поведение объектов
ExpandoОбъект с полями/методами "на лету"
JsonSlurper, JsonBuilderJSON
XmlSlurper, MarkupBuilderXML
groovy.sql.SqlJDBC без бойлерплейта

Eval (Eval.me('1+1')) — для REPL и прототипов; в продакшене предпочтительнее явный GroovyShell с ограничениями безопасности.


Связанные материалы


Как из "списка конструкций" собрать рабочий стиль

Самый полезный шаблон для прикладных задач:

  1. Считать данные (JsonSlurper, XmlSlurper, файл, HTTP).
  2. Преобразовать коллекции через findAll, collect, groupBy.
  3. Сформировать выход в JSON/XML.
  4. Обернуть в функцию или task Gradle/Jenkins.

import groovy.json.JsonSlurper
import groovy.json.JsonOutput

def users = new JsonSlurper().parseText('[{"name":"Ann","active":true},{"name":"Bob","active":false}]')
def activeNames = users.findAll { it.active }.collect { it.name }
println JsonOutput.toJson([activeUsers: activeNames])

Разбор:

  • Фрагмент на groovy показывает рабочий пример: начинается с import groovy.json.JsonSlurper и задает контекст выполнения.
  • Строки import подключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета.
  • Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
  • Поток выполнения строится на итерации: код последовательно применяет одну и ту же операцию к набору значений.
  • Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.

Такой pipeline покрывает значительную часть автоматизации, где Groovy особенно эффективен.


Чек-лист качества скрипта

  • Обрабатывайте ошибки ввода через try/catch и понятные сообщения.
  • Выносите "магические" значения в переменные или конфиг.
  • Разделяйте шаги "чтение", "обработка", "вывод" на отдельные функции.
  • Добавляйте 2-3 простых теста Spock для ключевой логики.

Связанные статьи — Spock — первая спецификация, Gradle Groovy DSL, Jenkins Pipeline, Job DSL Playground, Jenkins Shared Library.


Сквозной кейс — JSON-конвейер каталога

Собираем мини-скрипт, который читает входной JSON и готовит данные для БД:

Код ITЗагрузка примера кода…

Разбор:

  • Фрагмент на groovy показывает рабочий пример: начинается с import groovy.json.JsonSlurper и задает контекст выполнения.
  • Строки import подключают нужные классы и модули, чтобы дальше вызывать API без полного имени пакета.
  • Вызовы методов и объявления функций задают основной шаг логики: входные значения передаются в метод и сразу обрабатываются.
  • Поток выполнения строится на итерации: код последовательно применяет одну и ту же операцию к набору значений.
  • Итог фрагмента — воспроизводимый результат — вывод в консоль, изменение данных или артефакт, который можно сразу проверить.

Этот же выход удобно передавать в слой groovy.sql.Sql или GORM.

Продолжение кейса: Работа с базами данных.