Скрытые функции Groovy?

78
задан 10 revs, 7 users 37%anon 23 May 2017 в 12:17
поделиться

13 ответов

Используя точечный распространением оператор

def animals = ['ant', 'buffalo', 'canary', 'dog']
assert animals.size() == 4
assert animals*.size() == [3, 7, 6, 3]

Это - ярлык для animals.collect { it.size() }.

56
ответ дан 2 revs, 2 users 92%Paul King 24 November 2019 в 10:20
поделиться

Переупорядочение аргумента с неявными аргументами - другой хороший.

Этот код:

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" - я оставил их внутри только для ясности.

5
ответ дан Robert Fischer 24 November 2019 в 10:20
поделиться

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

new File("/etc/profile").withReader { r ->
    System.out << r
}
14
ответ дан John Flinchbaugh 24 November 2019 в 10:20
поделиться

В отличие от Java, в Groovy, что-либо может использоваться в переключатель оператор, не просто типы примитивов. В типичном метод eventPerformed

switch(event.source) {
   case object1:
        // do something
        break
   case object2:
        // do something
        break
}
15
ответ дан 2 revs 24 November 2019 в 10:20
поделиться

В отличных 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"]
15
ответ дан 2 revs 24 November 2019 в 10:20
поделиться
println 
"""
Groovy has "multi-line" strings.
Hooray!
"""
19
ответ дан 3 revs, 3 users 63% 24 November 2019 в 10:20
поделиться

Для тестирования кода 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' )
   }
}

Стандартная функция, но все еще действительно хороший.

ObjectGraphBuilder

(Действительно необходимо дать любые свойства POJO, которые являются List с значение по умолчанию пустого списка, а не null для поддержки разработчика работе.)

21
ответ дан 3 revs, 3 users 79% 24 November 2019 в 10:20
поделиться

Обнаружение, какие методы находятся на объекте, так же легко как выяснение у метакласса:

"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"]
35
ответ дан 2 revs, 2 users 96% 24 November 2019 в 10:20
поделиться

Кто-либо знает [приблизительно 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)
37
ответ дан 4 revs, 3 users 88% 24 November 2019 в 10:20
поделиться

Используя хеши как псевдообъекты.

def x = [foo:1, bar:{-> println "Hello, world!"}]
x.foo
x.bar()

Объединенный с утиным вводом, можно иметь большое значение с этим подходом. Не должны даже выкрикать "как" оператор.

37
ответ дан Robert Fischer 24 November 2019 в 10:20
поделиться

с метод позволяет поворачивать это:

 myObj1.setValue(10)
 otherObj.setTitle(myObj1.getName())
 myObj1.setMode(Obj1.MODE_NORMAL)

в это

 myObj1.with {
    value = 10
    otherObj.title = name
    mode = MODE_NORMAL
 }
39
ответ дан 3 revs, 2 users 96% 24 November 2019 в 10:20
поделиться

Реализация интерфейса на основе замыкания

Если у вас есть типизированная ссылка, например:

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
12
ответ дан 24 November 2019 в 10:20
поделиться

Для перехвата отсутствующих статических методов используйте следующие

 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

28
ответ дан 24 November 2019 в 10:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: