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

В этой и нескольких последующих заметках я расскажу о Groovy. Groovy - это динамический язык для платформы Java, позволяющий использовать в ява-проектах многие возможности таких языков, как Ruby, Python и Perl.

По сравнению с Java, Groovy имеет значительное число отличий, позволяющих писать во многих случаях более лаконичный и читабельный код:

Также, 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 // Изменение элемента, как поля

Также на эту тему

Ссылки

 Подписаться на RSS

 #  #  #  #  #  #  #  #  #  #

blog comments powered by Disqus