groovy:如何修改闭包中的值(类似于shell管道)



为了简化代码,我尝试使用类似管道的用法,如下所示:

  • 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

相关内容

最新更新