Используя точечный распространением оператор
def animals = ['ant', 'buffalo', 'canary', 'dog']
assert animals.size() == 4
assert animals*.size() == [3, 7, 6, 3]
Это - ярлык для animals.collect { it.size() }
.
Переупорядочение аргумента с неявными аргументами - другой хороший.
Этот код:
def foo(Map m=[:], String msg, int val, Closure c={}) {
[...]
}
Создает все эти различные методы:
foo("msg", 2, x:1, y:2)
foo(x:1, y:2, "blah", 2)
foo("blah", x:1, 2, y:2) { [...] }
foo("blah", 2) { [...] }
И т.д. Невозможно завинтить путем помещения названный и порядковые аргументы в неправильном порядке/положении.
, Конечно, в определении "нечто", можно бросить "Строку" и "интервал" из "Строкового сообщения" и "интервал val" - я оставил их внутри только для ясности.
Закрытия могут сделать всю старую попытку наконец, игры управления ресурсами уходят. Поток файла автоматически закрывается в конце блока:
new File("/etc/profile").withReader { r ->
System.out << r
}
В отличие от Java, в Groovy, что-либо может использоваться в переключатель оператор, не просто типы примитивов. В типичном метод eventPerformed
switch(event.source) {
case object1:
// do something
break
case object2:
// do something
break
}
В отличных 1.6, работе регулярных выражений со всеми итераторами закрытия (как каждый, собирают, вводят, и т.д.), и позвольте Вам легко работать с группами получения:
def filePaths = """
/tmp/file.txt
/usr/bin/dummy.txt
"""
assert (filePaths =~ /(.*)\/(.*)/).collect { full, path, file ->
"$file -> $path"
} == ["file.txt -> /tmp", "dummy.txt -> /usr/bin"]
println
"""
Groovy has "multi-line" strings.
Hooray!
"""
Для тестирования кода Java с отличным разработчиком графа объектов удивительно:
def company = builder.company( name: 'ACME' ) {
address( id: 'a1', line1: '123 Groovy Rd', zip: 12345, state: 'JV' )
employee( name: 'Duke', employeeId: 1 ){
address( refId: 'a1' )
}
}
Стандартная функция, но все еще действительно хороший.
(Действительно необходимо дать любые свойства POJO, которые являются List
с значение по умолчанию пустого списка, а не null
для поддержки разработчика работе.)
Обнаружение, какие методы находятся на объекте, так же легко как выяснение у метакласса:
"foo".metaClass.methods.name.sort().unique()
печать:
["charAt", "codePointAt", "codePointBefore", "codePointCount", "compareTo",
"compareToIgnoreCase", "concat", "contains", "contentEquals", "copyValueOf",
"endsWith", "equals", "equalsIgnoreCase", "format", "getBytes", "getChars",
"getClass", "hashCode", "indexOf", "intern", "lastIndexOf", "length", "matches",
"notify", "notifyAll", "offsetByCodePoints", "regionMatches", "replace",
"replaceAll", "replaceFirst", "split", "startsWith", "subSequence", "substring",
"toCharArray", "toLowerCase", "toString", "toUpperCase", "trim", "valueOf", "wait"]
Кто-либо знает [приблизительно 112] Elvis?
def d = "hello";
def obj = null;
def obj2 = obj ?: d; // sets obj2 to default
obj = "world"
def obj3 = obj ?: d; // sets obj3 to obj (since it's non-null)
Используя хеши как псевдообъекты.
def x = [foo:1, bar:{-> println "Hello, world!"}]
x.foo
x.bar()
Объединенный с утиным вводом, можно иметь большое значение с этим подходом. Не должны даже выкрикать "как" оператор.
с метод позволяет поворачивать это:
myObj1.setValue(10)
otherObj.setTitle(myObj1.getName())
myObj1.setMode(Obj1.MODE_NORMAL)
в это
myObj1.with {
value = 10
otherObj.title = name
mode = MODE_NORMAL
}
Реализация интерфейса на основе замыкания
Если у вас есть типизированная ссылка, например:
MyInterface foo
Вы можете реализовать весь интерфейс, используя:
foo = {Object[] args -> println "This closure will be called by ALL methods"} as MyInterface
В качестве альтернативы, если вы хотите реализовать каждый метод отдельно вы можете использовать:
foo = [bar: {-> println "bar invoked"},
baz: {param1 -> println "baz invoked with param $param1"}] as MyInterface
Для перехвата отсутствующих статических методов используйте следующие
Foo {
static A() { println "I'm A"}
static $static_methodMissing(String name, args) {
println "Missing static $name"
}
}
Foo.A() //prints "I'm A"
Foo.B() //prints "Missing static B"
-Ken