На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Использование Groovy: Ranges, Lists, Maps

В этой и нескольких последующих заметках я расскажу о 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 // Изменение элемента, как поля
наверх