В этой и нескольких последующих заметках я расскажу о Groovy. Groovy - это динамический язык для платформы Java, позволяющий использовать в ява-проектах многие возможности таких языков, как Ruby, Python и Perl.
По сравнению с Java, Groovy имеет значительное число отличий, позволяющих писать во многих случаях более лаконичный и читабельный код:
- Расширенные строки
- Встроенные ranges (промежутки), списки и maps (отображения)
- Spread Operator
- Встроенные регулярные выражения
- Поддержка замыканий
- Статическая и динамическая типизация
- Перегрузка операторов
- Мультиметоды
Также, Groovy удобен для написания скриптов, поскольку не требует создания класса, объявления метода main и т.
п. Сравните:Java:
public class MainClass {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
И Groovy:
println 'Hello World!'
К тому же, скрипт на Groovy можно задавать прямо в командной строке:
groovy -e "println 'Hello Wordl!!'"
Строки
Основное отличие строк в Groovy в том, что их существует два типа:
- Первые представляют из себя обычные строки Java, с той лишь разницей, что записываются они в одинарных кавычках.
- Вторые записываются двойных кавычках и предоставляют возможности для интерполяции, т.е. подстановки в строки значений выражений
Пример в коде:
def age = 20
def simpleStr = 'My age is $age' // Значение - "My age is $age"
def interpStr = "My age is $age" // Значение - "My age is 20"
Также, Groovy позволяет легко записывать многострочные константы, используя конструкцию “три кавычки”. Например:
def multiline = '''First line
Second line
Third line'''
Аналогично, можно использовать многострочные константы с тройными кавычками. Обе эти возможности (интерполяция и многострочные константы) очень удобны для генерации текстов по каким-либо шаблонам, в частности, генерации кода, с которой мне часто приходилось сталкиваться.
В Java для этого приходилось использовать достаточно неприятный синтаксис с большим количеством символов +, или прямым использованием класса StringBuilder.Ranges (Промежутки)
Прежде чем перейти к спискам в Groovy, стоит рассказать о ranges (промежутках), поскольку они добавляют к спискам весьма интересные возможности.
Range - это последовательность объектов, имеющая начало, и конец. Простейшим примером является последовательность целых чисел, от A до B.
Groovy предоставляет строенный синтаксис для их объявления:
def rng = 1..10
После создания объект может быть использован для различных запросов:
rng.size() // Получение длины
rng.contains(5) // Проверить наличие элемента
rng.from // Получить начало
rng.top // Получить конец
Списки
Groovy содержит встроенную поддержку списков. Списки объявляются путем перечисления элементов в квадратных скобках:
def someList = [1,2,3,4] // Создание списка
def emptyList = [] // Создание пустого списка
Обращение к элементам списка осуществляется по индексу, как к массиву в Java:
someList[0] // Обращение к элементу по индексу
Новые элементы могут быть добавлены в список различными способами:
someList[5] = 6 // Добавление элемента в список
someList << 7 << 8 // Добавление элементов в конец списка
someList += [ 9, 10 ] // "Приклеивание" списка
Теперь, совместное использование списков и ranges:
someList[1..3] // "Срезка" списка - получение подсписка
someList[2..4] = [ 12, 13, 14 ] // Изменение подсписка
Также, для индексирования можно использовать и списки:
someList[1,3,5..7,9] // Получение подсписка
Также, Groovy предоставляет встроенный цикл, для перебора элементов списка, или элементов любого объекта, реализующего интерфейс java.lang.Iterable:
for ( e in someList ) {
println e // Распечатываем все элементы списка someList
}
Коллекции других типов
По умолчанию, список, объявленный в Groovy имеет тип ArrayList. Но бывают случаи, когда необходимо использовать какую-либо другую реализацию коллекции, например LinkedList, или HashSet, или обычный массив Java. В этом случае, Groovy позволяет явно задать тип коллекция, используя следующую запись:
def linkedList = [1,2,3] as LinkedList
def set = [1,2,3] as Set
def array = [1,2,3] as Integer[]
Spread Operator
Для еще более удобной работы со списками и коллекциями, Groovy содержит так называемый Spread Operator. Оператор записывается как *. и обозначает вызов метода для каждого элемента списка. Например:
[1,2,3]*.plus(5) // Результат [6,7,8]
Maps (Отображения)
Аналогично спискам, Groovy поддерживает прозрачный синтаксис для работы с maps (ассоциативными массивами). Объявление выглядит следующим образом:
def someMap = [ 'a' : 1, 'b' : 2 ] // Объявление
Также, существует специальный синтаксис для объявления пустых отображений:
def emptyMap = [:] // Объявление пустого отображения
Доступ к элементам осуществляется по ключу, с использованием оператора [], или же с ключом как полем:
someMap['a'] // Доступ к элементу
someMap.a // Доступ к элементу как к полю
Аналогично производится и изменение элементов:
someMap['a'] = 2 // Изменение элемент
someMap.a = 2 // Изменение элемента, как поля