===== Groovy =====
[[https://www-tutorialspoint-com.translate.goog/groovy/index.htm?_x_tr_sl=en&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=sc]]\\
[[https://www.baeldung.com/groovy-lists]]\\
:!: Notes
- Все является объектами, все примитивные типы сразу же упаковываются в объекты\\
- все упаковочные типы неизменяемые, каждый раз при каком либо вычислении будет создаваться новый объект\\
- Groovy Strings (GStrings) можно вставлять параметры\\
- К строчкам применимы операции сложения и умножения, а так же инкремент/декремент\\
- На уровне конструкций языка поддерживаются регулярные выражения\\
- Встроенная поддержка maps и list
- Поддерживает Ranges\\
// GStrings
str1 = "${variable}"
str2 = "${2+2}"
// maps и list
a = [1, 2, 3]
==> [1, 2, 3]
b= [1: true, 0: false]
==> {1=true, 0=false}
Циклы\\
for (1 in 0..9) {
print i
}
for (int i=0; i<9; ++i) {
print i
}
for (Integer i: 0..9){
print i
}
Доступно большое кол-во методов для обработки последовательностей, к которым можно применять замыкание\\
'qwerty'.each {
print it
}
('a'..'z').each {
print it
}
('a'..'z').findAll {el -> // filter
el in ['e', 'y', 'i']
}.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
}
Файлы\\
Для директорий есть ф-я eachFile и eachFileRecursive\\
// Список файлов в директории
new File(.).eachFile{
print it
}
// Обработка текстовых файлов
new File('textfile.txt').eachLine {
print it
}
:!: Строки
В одинарных кавычках - Java Strings, внутри можно заключить двойные кавычки\\
В двойных кавычках - Groovy Strings (GStrings), как минимум, в такою строку можно подставить переменную, "внутри - ${}"\\
:!: Списки
Объявляются путем перечисления элементов в квадратных скобках\\
* **add()/pop()** - добавляет в конец/удаляет с конца
* **contains()** - true/false, содержится ли элемент
* **plus()/munis()** - создает новый список добавляя/удаляя указанные элементы
* **remove()** - удаляет в указанной позиции, удаляет в том же списке
* **revers()/sort()/size()**
def somw_list = [1, 2, 3, 4]
def empty_list = []
// Обращение
some_list[0]
// Добавление новых элементов
some_list[5] = 6
some_list << 7 << 8
some_list += [9, 19]
// Совместно с range
some_list[1..3] // срезка списка
some_list[2..4] = [12, 13, 14]
some_list[1, 2, 3..7, 8] // получение подсписка
Операции над списками
// Перебор
for (e in some_list) {
println e
}
some_list.each{ println it }
some_list.eachWithIndex{ it, i-> println "$i : $it" }
Фильтрация
assertTrue(some_list.findAll{ it>3 } == 4)
assertTrue(some_list.grep(Number) == [2,3,1,4,5,7])
some_list.unique()
Типы списков. По умолчанию **ArrayList**, можно объявить например **LinkedList**, **HashSet** или обычный массив Java\\
def linked_list = [1, 2, 3] as LinkedList
def set = [1, 2, 3] as Set
def array = [1, 2, 3] as Integer[]
**Spread Operator**\\
Вызов метода для каждого элемента списка\\
[1,2,3]*.plus(5) // каждый элемент увеличится на 5
:!: Maps
Ассоциативный массив, словарь\\
* **keySet()/values()** - набор ключей/значений в словаре, возвращает в виде списка
* **size()**
* **put(Object key, Object value)** - вкставка пары "ключ-значение", существующий ключ затирается
* **boolean containsKey(Object key)** - поиск указаного ключа, возвращает true/false
* **Object get(Object key)** - возвращает значение указанного ключа либо "Null"
def some_map = ['a':1, 'b':2]
def some_map = [:] // пустой
// Доступ
some_map['a']
come_map.a
some_map['a'] = 2
come_map.a = 2 // изменение как поля (?)
:!: Аргументы командной строки
println args
println args.length
println args.getClass()
println args[0]
println args[0].length()
println args[0].getClass()
if ((args.length == 0) || (args[0].length() == 0)) {
println "args must be set. error"
System.exit(1)
}
println "this good - '${args[0]}'"
///
/// вывод
/usr/bin/groovy grov.groovy "ddd"
[ddd]
1
class [Ljava.lang.String;
ddd
3
class java.lang.String
this good - 'ddd'
:!: