Я хочу определить закрытие, которое принимает один аргумент (на который я ссылаюсь с помощью it
), иногда я хочу передать еще один дополнительный аргумент в закрытие. Как я могу это сделать?
Groovy Closure с необязательными аргументами
Ответы (3)
Вы можете установить для второго аргумента значение по умолчанию (например, null):
def cl = { a, b=null ->
if( b != null ) {
print "Passed $b then "
}
println "Called with $a"
}
cl( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim
Другим вариантом было бы сделать b
списком vararg следующим образом:
def cl = { a, ...b ->
if( b ) {
print "Passed $b then "
}
println "Called with $a"
}
cl( 'Tim' ) // prints 'Called with Tim'
cl( 'Tim', 'Yates' ) // prints 'Passed [Yates] then Called with Tim
cl( 'Tim', 'Yates', 'Groovy' ) // prints 'Passed [Yates, Groovy] then Called with Tim
@TypeChecked
:-( - с @TypeChecked(value=TypeCheckingMode.SKIP)
он снова работает ... то же самое с версией varargs
- person Andreas Covidiot; 05.04.2018
надеюсь, это поможет
def clr = {...a ->
print "Passed $a then "
enter code here
}
clr('Sagar')
clr('Sagar','Rahul')
Варианты из @tim_yates не работают с @TypeChecked
(в контекст класса), по крайней мере, с Groovy 2.4.11
, где аргумент по умолчанию игнорируется и не компилируется :-(
Таким образом, другие (по общему признанию, более уродливые) решения, которые будут работать в этом случае:
сначала объявить о закрытии, кажется, работает нормально (в любом случае необходимо для рекурсии):
def cl cl = { ... }
- at least in Eclipse Neon / Groovy-Eclipse Plugin 2.9.2 the code completion/suggestions do not work either way using the closure later on in the same code block => so nothing lost as far as I can say
с
@TypeChecked(value=TypeCheckingMode.SKIP)
это будет работать для обоих, но тогда вы потеряете проверку типов для метода (или класса, в зависимости от того, где вы его поместили)объявить делегат закрытия
cl2
:@TypeChecked class Foo { static main( String[] args ) { def cl = { a, b -> if( b != null ) print "Passed $b then " println "Called with $a" } def cl2 = { a -> cl( a, null ) } cl2( 'Tim' ) // prints 'Called with Tim' cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim } }
преобразовать замыкание в метод класса, например.
@TypeChecked class Foo { cl( a, b=null ) { if( b != null ) print "Passed $b then " println "Called with $a" } static main( String[] args ) { cl( 'Tim' ) // prints 'Called with Tim' cl( 'Tim', 'Yates' ) // prints 'Passed Yates then Called with Tim } }