Groovy: различия между версиями

Содержимое удалено Содержимое добавлено
орфография
м <source> -> <syntaxhighlight> (phab:T237267)
Строка 4:
Откройте редактор и напишите программу. По традиции, первая программа должна просто выводить приветствие миру:
 
<sourcesyntaxhighlight lang="groovy">println "Hello World!"</sourcesyntaxhighlight>
 
Сохраните её в файл <code>helloworld.groovy</code> и запустите.
Строка 23:
Также комментарий можно расположить между <code>[[w:Косая_черта|/]]*</code> и <code>*[[w:Косая_черта|/]]</code>. Пример:
 
<sourcesyntaxhighlight lang="groovy">println 2 + 2 // это комментарий
println "Привет!" /* это тоже комментарий */
/* А это - многострочный
комментарий */</sourcesyntaxhighlight>
 
Результат иллюстрируемого кода будет располагаться после последовательности <code>//=></code>. Пример:
 
<sourcesyntaxhighlight lang="groovy">println 2 + 2 //=> 4
println "Привет" //=> Привет</sourcesyntaxhighlight>
 
= Переменные =
Переменная в Groovy определяется ключевым словом <code>def</code> (это аналогично типу Object в Java):
<sourcesyntaxhighlight lang="groovy">
def a = 1 // объявление "безтиповой" переменной, присвоение ей значения типа int
a = "String" /* так как мы не указали тип при объявлении этой переменной,
Строка 43:
b = "String for type int?" // так как тип переменной указан,
// то когда мы пытаемся присвоить String, получаем ошибку (GroovyCastException)
</syntaxhighlight>
</source>
 
= Строки =
Строка 51:
* Groovy Strings, известны как GStrings — в двойных кавычках; используя <code>${имя_переменной}</code> можно "вставить" внутрь строки значение переменной
 
<sourcesyntaxhighlight lang="groovy">
javaString = 'java' // Java String
groovyString = "Hello ${javaString}!" // GString
Строка 69:
println a * 3 // умножение
 
</syntaxhighlight>
</source>
 
= Списки =
Строка 75:
Groovy содержит встроенную поддержку списков. Списки объявляются путем перечисления элементов в квадратных скобках:
 
<sourcesyntaxhighlight lang="groovy">def someList = [1,2,3,4] // Создание списка
def emptyList = [] // Создание пустого списка</sourcesyntaxhighlight>
 
Обращение к элементам списка осуществляется по индексу, как к массиву в Java:
 
<sourcesyntaxhighlight lang="groovy">someList[0] // Обращение к элементу по индексу</sourcesyntaxhighlight>
 
Новые элементы могут быть добавлены в список различными способами:
 
<sourcesyntaxhighlight lang="groovy">someList[5] = 6 // Добавление элемента в список
someList << 7 << 8 // Добавление элементов в конец списка
someList += [ 9, 10 ] // "Приклеивание" списка</sourcesyntaxhighlight>
 
Теперь, совместное использование списков и ranges:
 
<sourcesyntaxhighlight lang="groovy">someList[1..3] // "Срезка" списка - получение подсписка
someList[2..4] = [ 12, 13, 14 ] // Изменение подсписка</sourcesyntaxhighlight>
 
Также, для индексирования можно использовать и списки:
 
<sourcesyntaxhighlight lang="groovy">someList[1,3,5..7,9] // Получение подсписка</sourcesyntaxhighlight>
 
Также, Groovy предоставляет встроенный цикл, для перебора элементов списка, или элементов любого объекта, реализующего интерфейс java.lang.Iterable:
 
<sourcesyntaxhighlight lang="groovy">for ( e in someList ) {
println e // Распечатываем все элементы списка someList
}</sourcesyntaxhighlight>
 
= Maps (Отображения) =
Строка 108:
Аналогично спискам, Groovy поддерживает прозрачный синтаксис для работы с maps (ассоциативными массивами). Объявление выглядит следующим образом:
 
<sourcesyntaxhighlight lang="groovy">def someMap = [ 'a' : 1, 'b' : 2 ] // Объявление</sourcesyntaxhighlight>
 
Также, существует специальный синтаксис для объявления пустых отображений:
 
<sourcesyntaxhighlight lang="groovy">
// Объявление пустого отображения
def emptyMap = [:]
def otherEmptyMap = [:] as HashMap
 
</syntaxhighlight>
</source>
 
Доступ к элементам осуществляется по ключу, с использованием оператора [], или же с ключом как полем:
 
<sourcesyntaxhighlight lang="groovy">someMap['a'] // Доступ к элементу
someMap.a // Доступ к элементу как к полю</sourcesyntaxhighlight>
 
Аналогично производится и изменение элементов:
<sourcesyntaxhighlight lang="groovy">someMap['a'] = 2 // Изменение элемент
someMap.a = 2 // Изменение элемента, как поля</sourcesyntaxhighlight>
 
Для хранения объектов в качестве ключа можно использовать скобки ():
 
<sourcesyntaxhighlight lang="groovy">
def map = [(new String("username")):"james", nickname:"jcameron", (new Integer(22)):1234]
println map.get(new Integer(22))
</syntaxhighlight>
</source>
 
= Условное исполнение =
Строка 139:
Одним из наиболее важных особенностей любого языка программирования является возможность выполнять различные коды в разных условиях.Простейший способ сделать это состоит в использовании '''IF''' конструкции. Например:
 
<sourcesyntaxhighlight lang="groovy">
def amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM){
Строка 146:
println("Good evening")
}
</syntaxhighlight>
</source>
 
Не беспокойтесь о длинной первой строке, это просто какой-то код, чтобы определить, сейчас утро или вечер. Остальная часть кода выполняется следующим образом: сначала оценивается выражение в круглых скобках и в зависимости от результата '''true''' (истинно) или '''false''' (ложно) выполняется первый или второй блок кода. Смотрите ниже раздел логические выражения.
Строка 152:
Обратите внимание, что ​​блок '''else''' не требуется, в отличии от первого блока:
 
<sourcesyntaxhighlight lang="groovy">
amPM = Calendar.getInstance().get(Calendar.AM_PM)
if (amPM == Calendar.AM){
println("Have another cup of coffee.")
}
</syntaxhighlight>
</source>
 
= Логические выражения =
Существует специальный тип данных в большинстве языков программирования, который используется для представления значений истинности,'''true''' (истина) и '''false''' (ложь). Простейшие логические выражения - это просто слова. Логические значения могут быть сохранены в переменных, как и любой другой тип данных:
 
<sourcesyntaxhighlight lang="groovy">
def myBooleanVariable = true
</syntaxhighlight>
</source>
 
Более сложные логические выражения использует один из булевых операторов:
Строка 180:
Некоторые примеры:
 
<sourcesyntaxhighlight lang="groovy">
def titanicBoxOffice = 1234600000
def titanicDirector = "James Cameron"
Строка 203:
titanicDirector >= "James Cameron" // вычисляется как истина
titanicDirector == "James Cameron" // вычисляется как истина
</syntaxhighlight>
</source>
 
Логические выражения особенно полезны при использовании совместно с '''if'''-конструкциями. Например:
 
<sourcesyntaxhighlight lang="groovy">
if (titanicBoxOffice + trueLiesBoxOffice > returnOfTheKingBoxOffice + theTwoTowersBoxOffice){
println(titanicDirector + " is a better director than " + returnOfTheKingDirector)
}
</syntaxhighlight>
</source>
 
Особенно полезна проверка на наличие значения. К примеру, определён ли данный ключ в карте:
 
<sourcesyntaxhighlight lang="groovy">
def suvMap = ["Acura MDX":"\$36,700", "Ford Explorer":"\$26,845"]
if (suvMap["Hummer H3"] != null){
println("A Hummer H3 will set you back "+suvMap["Hummer H3"]);
}
</syntaxhighlight>
</source>
 
Вообще '''null''' используется для указания на отсутствие значения выражения или переменной.
Строка 228:
Функции и методы всегда возвращают, как результат, последнее выражение.
 
<sourcesyntaxhighlight lang="groovy">
//класс пользователя
class Person{
Строка 267:
println hw
 
</syntaxhighlight>
</source>
 
= Closures =
Строка 275:
Синтаксис замыкания : { [closureArguments->] statements }
 
<sourcesyntaxhighlight lang="groovy">
def closureFunction = {a, b ->
println a
Строка 282:
closureFunction(1, 2)
</syntaxhighlight>
</source>
 
В замыканиях по умолчанию присутствует переменная '''it''' и ссылается на первый параметр в замыкании:
 
<sourcesyntaxhighlight lang="groovy">
def closureA = { it }
assert closureA() == null
assert closureA(1) == 1
</syntaxhighlight>
</source>
 
Вызов замыкания:
 
<sourcesyntaxhighlight lang="groovy">
def c = { it, arg-> println "${it} ${arg}" }
c.call("A", "B") // первый тип вызова
c("C", "D") // второй тип вызова
</syntaxhighlight>
</source>
 
Определение замыкания в классе и его вызов:
 
<sourcesyntaxhighlight lang="groovy">
public class ClassWithClosure {
private int member = 20;
Строка 325:
def closureVar = sample.publicMethodWithClosure("Xavier");
closureVar();
</syntaxhighlight>
</source>
 
Специальный класс [http://groovy.codehaus.org/gapi/groovy/util/Expando.html Expando] для создания динамических объектов и методов (как замыкания) которые можно вызывать:
 
<sourcesyntaxhighlight lang="groovy">
def player = new Expando()
player.name = "Alec"
Строка 338:
println player.greeting()
 
</syntaxhighlight>
</source>
 
= Работа с файлами =
 
<sourcesyntaxhighlight lang="groovy">
 
def out= new File('File1.txt')
Строка 375:
def dir2= new File('Directory2/SubDir1')
dir2.mkdirs()
</syntaxhighlight>
</source>
 
= Работа со строками =
 
<sourcesyntaxhighlight lang="groovy">
lst = /This is my new string./
println lst
Строка 389:
println "reverse me".reverse()
println "This is the end, my only friend!".tokenize(' ').reverse().join(' ')
</syntaxhighlight>
</source>
 
= Classes and Objects =
Строка 395:
Описание и создание класса(по умолчанию класс имеет тип доступа public, а переменные класса имеют тип доступа private, но компилятор groovy сам сделает для этих полей геттеры и сеттеры с доступом public):
 
<sourcesyntaxhighlight lang="groovy">
class Human {
String name
Строка 406:
 
def woman = new Human(name: "Eva", age: 22 )
</syntaxhighlight>
</source>
Для обновления поля или полей можно использовать такой подход:
 
<sourcesyntaxhighlight lang="groovy">
man.with{
name = "Adam"
age = 34
}
</syntaxhighlight>
</source>
 
Классы:
 
<sourcesyntaxhighlight lang="groovy">
// Классы могут не иметь конструктора
class ClassWithoutConstructor { }
Строка 458:
println catty.age
println catty.startDate
</syntaxhighlight>
</source>
 
Интерфейсы:
 
<sourcesyntaxhighlight lang="groovy">
// Объявление интерфейса
interface Voice{
Строка 511:
new Thread(mainRunnable).start()
 
</syntaxhighlight>
</source>
 
Наследование:
 
<sourcesyntaxhighlight lang="groovy">
class PersonA implements Comparable {
def firstname, initial, surname
Строка 552:
println g.grandChildName // => Rachel
 
</syntaxhighlight>
</source>
 
Абстрактные классы:
 
<sourcesyntaxhighlight lang="groovy">
abstract class Shape {
final name
Строка 588:
shapes = [new Circle(4.2), new Rectangle(5, 7)]
shapes.each { shape -> shape.printName() }
</syntaxhighlight>
</source>
 
Статические внутренние классы:
 
<sourcesyntaxhighlight lang="groovy">
class OuterClass {
static class StaticInnerClass {
Строка 604:
 
println myInstance.getAge()
</syntaxhighlight>
</source>
 
Анонимные внутренние классы:
 
<sourcesyntaxhighlight lang="groovy">
 
new Thread([run: {
Строка 621:
}
}] as Runnable).start();
</syntaxhighlight>
</source>
 
Enum:
 
<sourcesyntaxhighlight lang="groovy">
enum Color{
RED, GREEN, BLUE
Строка 633:
Color blueColor = "BLUE"
println blueColor
</syntaxhighlight>
</source>
 
= Расширенные возможности =
Строка 652:
Можно импортировать пакеты в статическом контексте, а также назначать алиасы/псевдонимы:
 
<sourcesyntaxhighlight lang="groovy">
import static java.awt.Color.BLUE
import static Boolean.FALSE as F // назначаем алиас с именем F
Строка 668:
println a
// напечатает 123
</syntaxhighlight>
</source>
 
<sourcesyntaxhighlight lang="groovy">
// представление списка как интерфейса Set
def contacts = ['a', 'b', 'c'] as Set
Строка 679:
println contacts['a'] // напечатает 10
 
</syntaxhighlight>
</source>
== Работа с данными ==
 
<sourcesyntaxhighlight lang="groovy">
// множественное присвоение
def (a, b, c) = [1,2,5]
Строка 706:
(10..1).each {println it}
[ 'a' : 1, 'b' : 2 ].each {key, value -> println key}
</syntaxhighlight>
</source>
 
== Дата и время ==
 
<sourcesyntaxhighlight lang="groovy">
import java.util.GregorianCalendar as D
import static java.util.Calendar.getInstance as now
Строка 722:
println 'Date was '+date.format("MM/dd/yyyy")
 
</syntaxhighlight>
</source>
 
== Аннотации ==
 
<sourcesyntaxhighlight lang="groovy">
// Эта аннотация которая генерирует из данного класса синглетон
@Singleton(lazy=true)
Строка 765:
}
 
</syntaxhighlight>
</source>
 
== Regular Expressions ==
Строка 772:
Оператор pattern (~) обеспечивает простой способ создать java.util.regex.Pattern.<br />
Пример:
<sourcesyntaxhighlight lang="groovy">
def p = ~/foo/
assert p instanceof Pattern
</syntaxhighlight>
</source>
В основном оператор pattern используется со слеш-строками (строки обрамлённых слешами), тем не менее этот оператор может использоваться с любыми видами строк Groovy:
<sourcesyntaxhighlight lang="groovy">
p = ~'foo' /*1*/
p = ~"foo" /*2*/
p = ~$/dollar/slashy $ string/$ /*3*/
p = ~"${pattern}" /*4*/
</syntaxhighlight>
</source>
# использование строк в одинарных кавычках
# использование строк в двойных кавычках
Строка 790:
=== Find operator ===
Alternatively to building a pattern, you can directly use the find operator =~ to build a java.util.regex.Matcher instance:
<sourcesyntaxhighlight lang="groovy">
def text = "some text to match"
def m = text =~ /match/ /*1*/
Строка 797:
throw new RuntimeException("Oops, text not found!")
}
</syntaxhighlight>
</source>
# =~ creates a matcher against the text variable, using the pattern on the right hand side
# the return type of =~ is a Matcher
Строка 805:
=== Match operator ===
The match operator (==~) is a slight variation of the find operator, that does not return a Matcher but a boolean and requires a strict match of the input string:
<sourcesyntaxhighlight lang="groovy">
m = text ==~ /match/ /*1*/
assert m instanceof Boolean /*2*/
Строка 811:
throw new RuntimeException("Should not reach that point!")
}
</syntaxhighlight>
</source>
# ==~ matches the subject with the regular expression, but match must be strict
# the return type of ==~ is therefore a boolean
Строка 823:
= Groovy SQL =
Подключение к базе данных и запрос SELECT(необходимо подключить драйвер JDBC для MySQL или другой базы):
<sourcesyntaxhighlight lang="groovy">
import groovy.sql.Sql
 
Строка 834:
)''')
 
</syntaxhighlight>
</source>
 
== Выполнение простого sql-запроса ==
 
Вставка новой записи:
<sourcesyntaxhighlight lang="groovy">
def age = 25
def name = "Adam"
Строка 845:
// or
sql.executeInsert("insert into users (username, age) values (${name}, ${age})")
</syntaxhighlight>
</source>
 
Выборка первой записи из результата запроса:
<sourcesyntaxhighlight lang="groovy">
def rowFirst = sql.firstRow('select username, age from users')
println "Row: Name = ${rowFirst.username} and Age = ${rowFirst.age}"
</syntaxhighlight>
</source>
 
Выборка всех записей:
<sourcesyntaxhighlight lang="groovy">
sql.eachRow("select * from users"){ row -> println row.username }
</syntaxhighlight>
</source>
Удаление записи:
<sourcesyntaxhighlight lang="groovy">
int id = 2
sql.execute('delete from users where id = ?' , [id])
</syntaxhighlight>
</source>
 
Обновление записи:
<sourcesyntaxhighlight lang="groovy">
def newUsername = 'New Name'
int rowsAffected = sql.executeUpdate('update users set username = ? where id=2', [newUsername])
println "updated: ${rowsAffected}";
</syntaxhighlight>
</source>
 
== Выполнение более сложных запросов ==
<sourcesyntaxhighlight lang="groovy">
import groovy.sql.Sql
import groovy.sql.DataSet
Строка 883:
DataSet findedUsers = users.findAll() // получение всех записей и их вывод
findedUsers.each{ println it.username}
</syntaxhighlight>
</source>
 
Добавление записей в транзакции:
<sourcesyntaxhighlight lang="groovy">
import groovy.sql.Sql
 
Строка 899:
users.add(username: "Alec 2", age: 25)
}
</syntaxhighlight>
</source>
 
Блочное добавление записей:
 
<sourcesyntaxhighlight lang="groovy">
import groovy.sql.Sql
 
Строка 912:
ps.addBatch(["New Name", 31])
}
</syntaxhighlight>
</source>
 
== Call Procedure ==
Вызов процедур:
<sourcesyntaxhighlight lang="groovy">
import groovy.sql.Sql
 
Строка 928:
assert name == 'Adam'
}
</syntaxhighlight>
</source>
 
= Прочие советы =
== Работа с JSON ==
 
<sourcesyntaxhighlight lang="groovy">
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
Строка 956:
println doc.person.username // вывод имени
doc.person.pets.each {println it} // вывод животных
</syntaxhighlight>
</source>
 
== Работа с XML ==
Строка 962:
Создание XML документа из объекта:
 
<sourcesyntaxhighlight lang="groovy">
import groovy.xml.MarkupBuilder
 
Строка 978:
}
println writer.toString()
</syntaxhighlight>
</source>
 
Работа с HTML:
 
<sourcesyntaxhighlight lang="groovy">
 
import groovy.xml.MarkupBuilder
Строка 1000:
 
println writer.toString()
</syntaxhighlight>
</source>
 
Парсинг XML документа
<sourcesyntaxhighlight lang="groovy">
def xmlString = """
<person>
Строка 1019:
println person.username
person.pets.pet.each {println "pet's name:"+it}
</syntaxhighlight>
</source>
 
== Потоки и асинхронная работа ==
 
<sourcesyntaxhighlight lang="groovy">
//эта аннотация скачивает и устанавливает библиотеку в classpath
@Grab(group='org.codehaus.gpars', module='gpars', version='0.12')
Строка 1044:
}
}
</syntaxhighlight>
</source>
 
= Ссылки =