Язык программирования Groovy
Groovy — язык, основанный на синтаксисе и принципах Java. Он использует объектно ориентированный подход к построению программ. Типизация данных в Груви может быть как статической, так и динамической. Для компиляции языка используется Java Virtual Machine.
История разработки
Джеймс Стрекан, создатель Groovy, впервые рассказал о своем детище в 2003 году через публикацию в своем блоге. Правда, официальная версия платформы была представлена только в январе 2007, и именно она получила префикс 1.0. Последняя на текущий момент итерация языка, под номером 3.0, вышла в 2020 году.
Сам Джеймс Стрекан покинул команду разработки еще до релиза Groovy 1.0. Позже он писал, что язык Scala, как и Груви представляющий собой надстройку над Java, показался ему более перспективным.
В настоящее время язык является собственностью корпорации Dell, а также поддерживается организацией-фондом Apache Software Foundation.
Особенности языка
В Groovy есть ряд “фишек”, отличающих его от Java и многих других ООП языков.
- Совмещение статической и динамической типизации.
Статическая типизация предполагает строгое указание типа переменной при ее объявлении. При динамическом подходе это действие не обязательно, компилятор определяет тип самостоятельно. Груви использует оба метода типизации, в отличие от Java, где доступна только статика. - Замыкания в коде.
Замыкания, или closure, это, по сути, функции встроенные в функций. Они могут взаимодействовать с локальными переменными внутри “родителя”. Замыкания связывают данные в единую цепочку и упрощают взаимодействия внутри программы. - Метапрограммирование.
Groovy использует runtime и compile time программирование. Это значит, что части исходного кода можно расширять не только во время компиляции, но и при исполнении программы. - Перегрузка операторов.
Перегрузка, или переопределение, операторов применяется для использования одинаковых функций и методов для различных типов данных в общей области видения. Например, извлечения корня как из вещественных, так и дробных или комплексных чисел. Groovy может перегружать стандартные операторы, а Java — нет. - Дополнительный тип строчных переменных.
В Груви есть строчный тип GString с двойными кавычками. Стандартные строки с одинарными кавычками, как в Java, тоже поддерживаются. - Оригинальный синтаксис массивов и списков.
Новый тип массивов в Groovy, под названием Maps, позволяет создавать группы из объединенных в пары элементов. Например, ExMap = [ ‘x’ : 1, ‘y’ : 2, ‘z : 3 ].
Range — это тип данных, представляющий собой промежуток значений с заданным началом и окончанием — ряд чисел, алфавитная последовательность и т. п. - Интеграция языков разметки.
Груви совместим с разметкой XML и HTML формата. Он может как парсить существующие документы, так и создавать новые через древовидную структуру данных.
Преимущества Groovy

Рассмотрим главные плюсы языка.
- Полная интеграция с Java.
Груви дополняет и улучшает код, написанный на Java. Программы. написанные на Groovy, без проблем считываются компилятором JVM. - Доступность в популярных IDE.
Рассматриваемый язык включают в себя большинство применяемых интегрированных сред разработки: NetBeans, Eclipse и др. - Простота освоения.
Особенно это актуально для программистов, знакомых с Java, Python и подобными языками. Им синтаксис Groovy покажется знакомым и привычным. - Параллельные и асинхронные вычисления.
Программы на Груви быстро выполняются за счет параллельного вычисления потоков. Благодаря этому свойству рассматриваемый язык часто применяется для разработки реактивных веб-приложений, где важна скорость ответа системы на действия пользователя. - Поддержка Apache Foundation.
Независимый фонд оказывает значительное влияние на развитие языка, улучшая его в лучшую сторону и повышая доверие сообщества к платформе.
Где применяется язык
Groove — язык программирования общего назначения. Он используется во многих сферах разработки.
- Веб приложения.
Grails, фреймворк Groovy, отлично подходит для создания быстрых, высоконагруженных сайтов и веб-систем с мгновенным ответом на пользовательские запросы. - Микросервисные платформы.
Фреймворк Micronaut позволяет разрабатывать приложения, основанные на микросервисах — изолированных фрагментах программы, взаимодействующих между собой через специальные команды. - Десктопные приложения.
ПО для компьютеров на Groovy пишется через фреймворк Griffon. - Сценарии тестирования.
Тесты для сайтов и браузерных приложений можно написать, используя приложение SoapUI. Фреймворк Geb также подойдет для этих целей. - Параллельные вычисления.
Распределительные системы на Groovy выполняются за счет встроенной системы Graps. - Программы для обработки данных.
Часто язык используется для написания кода, обрабатывающего большие массивы данных, например, для статистических и научных исследований.
Примеры кода
Для вывода на экран надписи понадобится всего одна команда.
print("Hello world!")
Рассмотрим также, как в Groovy устроены методы функций.
class Example < static void mlp(int x,int y) < int m = x*y; println(m); >static void main(String[] args) < mlp(3,4); >>

Заключение
Groovy — язык программирования, дополняющий Java и расширяющий его возможности. В нем есть динамическая типизация, обновленные типы данных, возможность прямой работы с XML и другие “фишки”. Благодаря фреймворкам и расширениям Груви используется фактически во всех сферах разработки — от веб-среды до проверочных тестов.
Groovy за 15 минут – краткий обзор
Groovy — объектно-ориентированный язык программирования разработанный для платформы Java как альтернатива языку Java с возможностями Python, Ruby и Smalltalk.
Groovy использует Java-подобный синтаксис с динамической компиляцией в JVM байт-код и напрямую работает с другим Java кодом и библиотеками. Язык может использоваться в любом Java проекте или как скриптовый язык.
Возможности Groovy (отличающие его от Java):
— Статическая и динамическая типизация
— Встроенный синтаксис для списков, ассоциативных массивов, массивов и регулярных выражений
— Замыкания
— Перегрузка операций
Более того, почти всегда java-код — это валидный groovy-код.
Установка
Для установки нужно скачать архив с оф. сайта , распаковать его в удобное место и добавить переменyю окружения GROOVY_HOME, и добавить путь до groovy/bin в PATH:
export GROOVY_HOME=~/path/to/groovy/ export PATH=$GROOVY_HOME/bin:$PATH
В IDE NetBeans 7.0 поддержка groovy идет из коробки, для IDE Eclipse существует очень хороший плагин, который можно взять здесь.
Groovy
Самое главное отличие от java: в Groovy всё является объектами. Все примитивные типы сразу же упаковываются в объекты. Т.е. «int x» на самом деле является «Integer x»
println 1.class int a = 10 println a.class
class java.lang.Integer class java.lang.Integer
Следует не забывать о том, что все упаковочные типы — неизменяемые, поэтому каждый раз при каком-либо вычислении будет создаваться новый объект.
Строки в Groovy
1) Java Strings — строки в одинарных кавычках
2) Groovy Strings, они же GStrings — в обычных кавычках
В строках groovy можно вставлять параметры, в обычные строки — нельзя
javaString = 'java' groovyString = "$" j = '$' bigGroovyString = """ $ $ $ $ """ println bigGroovyString
java java $ 4
К строкам применимы операции + и *
groovy:000> a = "a" ===> a groovy:000> a + "123" ===> a123 groovy:000> a * 5 ===> aaaaa
Так же к строкам применимы ++ и — — (т.к. в groovy поддерживается перегрузка операторов)
groovy:000> a = 'abc' ===> abc groovy:000> a++ ===> abd groovy:000> a-- ===> abс
В groovy есть поодержка регулярных выражений на уровне конструкций языка:
groovy:000> r =~ '^a$' ===> java.util.regex.Matcher[pattern=^a$ region=0,1 lastmatch=]
Встроенная поддержка maps + lists
Так же на уровне конструкций языка поддерживаются словари (maps) и списки:
groovy:000> a = [1, 3, 5] ===> [1, 3, 5] groovy:000> b = [1: true, 0: false] ===>
Ranges
Получать доступ к элементам списков в groovy можно следующим образом:
groovy:000> a = "0123456789" ===> 0123456789 groovy:000> a[1..4] ===> 1234 groovy:000> a[1..-1] ===> 123456789 groovy:000> a[-1..0] ===> 9876543210 groovy:000> a[1.. 12345678 groovy:000> a[1, 3, 5] ===> 135 groovy:000> b = 1..5 ===> 1..5 groovy:000> a[b] ===> 12345
Range — это такой же объект, поэтому возможны конструции, подобные последней. Отрицательные индексы, как в python, возвращают элементы с конца списка.
Range можно составить из строк:
groovy:000> 'a'..'aa' ===> a..aa
Более того, range можно сделать из любого объекта, у которого есть методы next() и prev().
Циклы
Циклы в groovy точно такие же, как и в java, плюс к ним добавляется еще один «foreach»:
for (i in 0..9) < print i >for (int i = 0; i < 9; ++i) < print i >for (Integer i : 0..9)
Функции
def functionA(argA) < print ArgA >int functionB(int argB) < print argB return argB >String fuctionC()
Ключевое слово return указывать не обязательно — по умолчанию будет возвращено значение последней упомянутой переменной в фукции.
Closures
Closure — это анонимная функция
def cl = println a println b > cl(1, 2)
У многих объектов есть методы, в качестве параметров которым передаются closure:
1.upto 10, < print it >10.times
Доступно большое количество методов для обработки последовательностей, к которым можно применять замыкания:
'qwerty'.each < print it >('a'..'z').each < print it >('a'..'z').findAll < el ->// = filter el in ['e', 'y', 'u', 'i', 'o', 'a'] >.each < print it + ' ' >(0..10).collect < el ->// = map el * 10 >.each < print it + ' ' >def sum = (0..10).inject(0) < prev, elem ->// = reduce return prev + elem >
В closure так же не обязательно использовать ключевое слово return. Если явно не задано имя параметру, то по умолчанию используется it.
Так как closure является объектом, то ничего не мешает возвращать его из другого closure, и таким образом создавать функции высших порядков:
def cloA = def cloB = < return param * 10 >> def b = cloA(10) println b(10)
Файлы
Для директорий есть функции eachFile и eachFileRecursive:
new File('.').eachFile
./.project ./src ./.settings ./.classpath ./bin
Для обработки текстовых файлов — функция eachLine:
new File('textfile.txt').eachLine
Писать в файлы так же очень удобно:
def pw = new File('textfile.txt').newPrintWriter() pw.println("new line")
Классы
class Account < String name BigDecimal value >// конструктор по умолчанию добавляется автоматически // такой конструктор - синтаксический сахар для // a = new Account() // a.setName("Account #1") // a.setValue(new BigDecimal(10)) a = new Account(name : "Account #1", value : new BigDecimal(10)) // геттеры и сеттеры генерируются автоматически def name = a.getName() a.setName("Account #2") println "$" class Person < def first def last // явно задаем сеттер void setFirst(first) < println "$is becoming $" this.first = first > > p = new Person(first : "A", last : "G") // если обращаться к полю, то будет использоваться сеттер p.first = "C" println "$ $" // наследвание как в java class ExtendedAccount extends Account < def debt // задаем конструктор ExtendedAccount(name, value, debt) < setName(name) setValue(value) setDebt(debt) >def String toString() < "$$ $" > > // тут будет ошибка "Could not find matching constructor for: ExtendedAccount()" //e = new ExtendedAccount() println new ExtendedAccount("A", new BigDecimal(10), 1)
Неизменяемые классы задаются с помощью аннотации Immutable:
@Immutable class ImmutableClass < String a Integer b >def ic = new ImmutableClass(a : "a", b : 1)
При использовании этой аннотации нужно явно указывать, какого типа данных поле.
Операторы
def b = a ?: "b"
Проверяет переменную a, и если в ней null или false, то берет указанное следом значение. Иначе берется значение переменной a.
«?.» Safe navigation
Используется для избежания ошибки NullPointerException
def user = Users.get("a") def posts = user?.posts println posts
Вернет null, если если в user содержится null вместо того, чтобы бросать NullPointerException.
«*.» Spread operator
Применяет указанный метод для всех элементов какой-либо коллекции. Эквивалент следующему:
parent*.action == parent.collect child?.action>
def sizes = ['string', 'long string']*.size() println sizes
[6, 11]
Так же монжо использовать для составления списков и словарей:
def x = [2, 3] def y = [0, 1, *x, 4] println y def a = [3 : 'c', 4 : 'd'] def b = [1 : 'a', 2: 'b', * : a, 5 : 'e'] println b
[0, 1, 2, 3, 4] [1:a, 2:b, 3:c, 4:d, 5:e]
В Groovy можно перегружать операторы +, -, * и т.п. Для этого нужно определить соотвествующий метод для класса. Например, для перегрузки оператора ++ нужно переопределить метод next():
class RandomVal < // для этого поля не будут сгенерированы сеттеры и геттеры private def value private Random randomGen = new Random() def next() < this.value = randomGen.nextInt() >RandomVal() < this.value = randomGen.nextInt() >def String toString() < "$" > > def r = new RandomVal() println(r) r++ println(r)
SQL
SQL запросы обрабатываются очень просто:
import groovy.sql.Sql def final ADDRESS = "jdbc:jtds:sqlserver://serverName/dbName" def final USERNAME = "username" def final PASSWD = "password" def final DRIVER = "net.sourceforge.jtds.jdbc.Driver" sql = Sql.newInstance(ADDRESS, USERNAME, PASSWD, DRIVER) sql.eachRow("select * from tableName") < el ->println "$ -- $" > def firstName = "A" def lastName = "G" sql.execute("insert into tableName (firstName, lastName) " + "values ($, $)") sql.execute("insert into tableName (firstName, lastName) " + "values (?, ?)", [firstName, lastName])
XML
В groovy существуют билдеры, которые можно использовать для генерации XML. Для генерации создается экземпляр объекта MarkupBuilder, на котором вызываются псевдо-методы — название этого метода и переданные параметры будет использоваться для генерации тега:
import groovy.xml.MarkupBuilder def mb = new MarkupBuilder() mb.html() < head() < title("This is the title") >body() < div("class" : "main") < p("this is the body") >> >
This is the title this is the body
В качестве параметра конструктору MarkupBuilder можно передавать любой PrintWriter:
def fb = new MarkupBuilder(new File("index.html").newPrintWriter())
Парсинг XML так же очень простой:
import groovy.xml.MarkupBuilder import java.io.StringWriter def sw = new StringWriter() def mb = new MarkupBuilder(sw) mb.html() < body() < div("class" : "main") < p("this is the body") >div() < p("this is the body 1") p("this is the body 2") p("this is the body 3") >> > def xml = sw.toString() println xml import groovy.util.XmlParser; def parser = new XmlParser() def doc = parser.parseText(xml) //def doc = parser.parse("index.html") println doc.body.div[1].p[1] // возвращает Node println doc.body.div[1].p // возвращает список, состоящий из Node println doc.body.div["@class"] // список значений аттрибута class для всех div
this is the body
this is the body 1
this is the body 2
this is the body 3
p[attributes=<>; value=[this is the body 2]] [p[attributes=<>; value=[this is the body 1]], p[attributes=<>; value=[this is the body 2]], p[attributes=<>; value=[this is the body 3]]] [main, null]
Groovlets
С помощью класса GroovyServlet возможно запускать скрипты на Groovy как сервлеты.
В первую очередь, для этого нужно добавить несколько строчек в web.xml:
GroovyServlet groovy.servlet.GroovyServlet GroovyServlet *.groovy
Теперь все запросы для файлов .groovy будут обрабатываться классом GroovyServlet.
В этих скриптах уже доступны для использования следующие переменные:
— request & response
— context, application, session
— out (= response.getWriter())
— sout (= response.getOutputStream())
— html (= new MarkupBuilder(out))
html.html() < body() < div("class" : "main") < p("this is the body") >div() < p("this is the body 1") p("this is the body 2") p("this is the body 3") >> >
Отдаст браузеру сгенерированную html-страницу.
Что пишут на Groovy?
Groovy — известный объектно-ориентированный язык программирования, который был разработан для платформы Java в качестве дополнения к этому языку, причем дополнения, обладающего возможностями Python, Ruby и Smalltalk. Groovy использует в своей работе Java-подобный синтаксис и динамически компилируется в JVM байт-код, а также может напрямую работать с Java-библиотеками и другим Java-кодом.
На практике Groovy можно использовать практически в любом Java-проекте, хотя никто не мешает применять его и в качестве скриптового языка. Например, язык очень активно используют в роли предметно-ориентированного языка для написания самых разных скриптов, необходимых для работы в таких предметных областях, как математика, обработка научных данных и т. д. Кроме того, подходит Groovy и для сборки и тестирования приложений (Gradle).
Groovy прошел стандартизацию в Java Community Process (JSR 241).
Основные возможности:
- поддерживается статическая и динамическая типизация;
- встроен синтаксис для списков;
- поддерживаются ассоциативные массивов, а также массивы и регулярные выражения;
- поддерживается перегрузка операций;
- возможна работа с замыканиями, которые появились в Groovy задолго до Java.

Что написано на Groovy:
- web-фреймворк Grails (именно в сочетании с этим фреймворком Groovy нашел свое основное применение);
- неблокирующий web-фреймворк Ratpack;
- web-фреймворк для создания web-сайтов/приложений, работающих на микросервисах Micronaut;
- web-фреймворк для тестирования Spock-приложений;
- десктопный фреймворк Griffon;
- фреймворк для параллельных/распределенных вычислений с применением системы «акторов» Gpars;
- фреймворк Geb, предназначенный для тестирования web-сайтов;
- ORM-обертка над БД GORM;
- программный комплекс SDKMAN!, предназначенный для управления версиями языков программирования Java/Groovy/Scala/Kotlin/Ceylon, а также таких приложений, как Maven, SBT, Spark, Ant, Gradle, Grails, Spring Boot, Vert.x (полный перечень смотрите здесь).
Хотите прокачать свои навыки по программированию на Groovy? Добро пожаловать на специализированный курс в Otus!
Язык программирования Groovy — для чего используется
Groovy — интерпретируемый язык программирования с объектно ориентированной парадигмой и Java-подобным синтаксисом. Он совмещает в себе статическую и динамическую типизацию, что выгодно отличает его от “прародителя”. Кроме Java, на создание и развитие языка повлияли Ruby, Python и другие ООП платформы.
История создания
Впервые Groovy был упомянут своим создателем, Джеймсом Стрэканом, еще в 2003 году. При этом первая официальная стандартизированная версия платформы под номером 1.0 вышла только в начале 2007. Позднее Стрэкан покинул разработку, посчитав другой Java-подобный язык — Scala, более перспективным. Сейчас актив Groovy принадлежит корпорации Dell. В 2020 году вышла 3-я, улучшенная версия платформы.
Преимущества языка
- Сильная интеграция с Java.
Программы на Groovy фактически полностью совместимы с Java. Можно сказать, что Груви плавно дополняет код на другом языке, а не меняет его принципиально. - Легкость изучения.
Этот пункт следует из предыдущего. Разработчик, освоивший Джава, легко освоит и смежную с ним платформу. - Поддержка популярных IDE.
Groovy доступен в таких распространенных интегрированных средах разработки, как Eclipse, NetBeans и IntelliJ IDEA. - Наполненная экосистема.
Груви подходит для веб-разработки и создания реактивных приложений за счет наличия возможностей для параллельных и асинхронных вычислений. - Участие в Apache Foundation.
Поддержка известного фонда способствует стабильному развитию языка и повышению доверия пользователей.
Особенности Groovy

- Поддержка статической и динамической типизации.
В отличие от Java с его строгой статической типизацией, Груви может похвастаться динамическим присвоением типов переменным. Эта функция делает программирование более гибким. - Runtime и compile time метапрограммирование.
Расширение методов и классов в Groovy возможно как при компиляции, так и непосредственно во время исполнения программы. - Специальный синтаксис для массивов и списков.
В этом языке расширена возможность работы с некоторыми типами данных. Например, добавлены ассоциативные массивы Maps, представляющие собой последовательность связанных попарно элементов. Например, myMap = [ ‘a’ : 1, ‘b’ : 2, ‘c’ : 3 ].
Тип Range используется для создания списков (промежутков) с определенным началом и концом — к примеру, последовательности из чисел от 1 до 5. - Использование замыканий.
Замыкания — это небольшие фрагменты кода, которые могут принимать заданные параметры и оперировать локальными переменными, и при этом сами могут быть использованы сторонними методами для вычислений. - Поддержка перегрузки операторов.
В классическом Java нельзя было переопределять стандартные операторы. Groovy быстро исправил этот недочет. Теперь одни и те же операторы можно использовать для разных типов параметров в общей области видения. - Встроенная поддержка языков разметки.
Groovy позволяет создавать древовидные структуры данных и генерировать из них XML и HTML файлы. Доступен на платформе и парсинг существующих файлов. - Наличие строк GStrings с двойными кавычками.
Груви поддерживает как привычный для Джава синтаксис строчных переменных с одинарными кавычками, так и предлагает свой — с двойными.
Что пишут на Groovy
- Веб-приложения.
Самое широкое применение Groovy нашел благодаря своему веб-фреймворку Grails. На нем можно создавать гибкие, производительные приложения различной направленности. Во многом Grails напоминает другой известный веб-фреймворк — Ruby on Rails. - Desktop приложения.
Фреймворк Griffon позволяет писать на Груви функциональное программное обеспечение для десктоп-устройств. - Микросервисные сайты и приложения.
Микросервисными называют приложения, состоящие из отдельных независимых компонентов, взаимодействующих друг с другом в рамках единой системы. За такой подход отвечает фреймворк Micronaut. - Тесты для сайтов и приложений.
На Груви можно написать сценарии тестирования для сайтов и веб-приложений с помощью приложения SoapUI или фреймворка Geb. - Параллельные вычисления.
Система Gpars, встроенная в язык, позволяет эффективно производить распределенные вычисления. - Прикладные скрипты для обработки данных.
Groovy нередко используется для написания вычислительных программ, решающих практические научные и исследовательские вопросы.
Примеры кода
Элементарный вывод строки на рассматриваемом языке вызывается в одну строку.
print("Hello world!") Методы в Груви работают следующим образом. class Example < static void sum(int x,int y) < int s = a+b; println(s); >static void main(String[] args) < sum(3,4); >>

Здесь мы задали простую функцию, возвращающую сумму двух параметров.
Заключение
Groovy — инструмент, отлично дополняющий классический Java. Благодаря большому количеству фреймворков, этот язык успешно применяется во многих сферах программирования. Синтаксис Груви не перегружен и достаточно легко читается. На текущий момент платформа поддерживается крупными корпорациями и развивается, исходя из потребностей пользователей.
