===== 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'
:!: