为了简化代码,我尝试使用类似管道的用法,如下所示:
foo( 'abc' )
->'abc ~> 123'
(默认结果)foo( 'abc' ).bar( 'efg' )
->'efg : abc ~> 123'
(必要时附加)
所以,我尝试使用Map+按如下方式处理:
def foo ( String aStr ) {
String constant = '123'
String result = "${aStr} ~> ${constant}"
[
bar : { String bStr -> result = "${bStr} : ${result}"; return result }
]
println result
}
foo( 'abc' ) // abc ~> 123
foo( 'abc' ).bar( 'efg' ) // java.lang.NullPointerException: Cannot invoke method bar() on null object
第二次尝试
I被添加default键在映射结构如下。但是,它工作得很好:
- 调用
println
两次 - 必须添加额外的
default
键值
def foo ( String aStr ) {
String constant = '123'
String result = "${aStr} ~> ${constant}"
[
bar : { String bStr -> result = "${bStr} : ${result}"; println "${result}" } ,
default : { println result }
]
}
foo( 'abc' ).bar( 'efg' ) // efg : abc ~> 123
foo( 'abc' ).default() // abc ~> 123
第三次尝试
makebar
允许非参数,因此它可以作为foo(..).bar()
调用,但仍然不能直接通过foo(..)
调用
def foo ( String aStr ) {
String constant = '123'
String result = "${aStr} ~> ${constant}"
[
bar : { String bStr = '' -> result = "${bStr ? "${bStr} : " : ''}${result}"; return result }
]
}
foo( 'abc' ) // [bar:ConsoleScript22$_foo_closure1@5e7667fd]
foo( 'abc' ).bar() // abc ~> 123
foo( 'abc' ).bar( 'efg' ) // efg : abc ~> 123
有更好的解决方案吗?
不是100%确定我理解了这个问题,但是您可以编写一个生成元素链的helper类
class Result {
String name
def value
def bar(String aStr) {
new Result(name: aStr, value: this)
}
@Override
String toString() {
if (value instanceof String) {
return "${name} ~> ${value}"
} else {
return "${name} : ${value?.toString()}"
}
}
}
然后,你的Foo方法变成:
Result foo(String aStr) {
new Result(name: aStr, value: '123')
}
并调用下列命令,输出如下结果:
println foo('abc')
println foo('abc').bar('efg')
println foo('abc').bar('efg').bar('hahaha')
abc ~> 123
efg : abc ~> 123
hahaha : efg : abc ~> 123