Groovy:将两行不同的两个函数重写为一个?

时间:2015-07-22 19:20:36

标签: groovy closures

鉴于我们有一个如下所示的循环:

for (some a in someArray) {    
 doSomething

 someClassA.set(fieldA, fieldB, fieldC)

 doSOmething
}

for (some a in someArray) {    
 doSomething

 someClassB.set(fieldX, fieldY, fieldZ)

 doSOmething
}

是否有可能不在Groovy中公开2循环块的描述?

换句话说,我可以编写一些能完成工作的单一功能吗?

2 个答案:

答案 0 :(得分:1)

您可以使用封装该单行逻辑的闭包并将其传递给循环并执行该块的方法:

def doA = { some -> some.set(fieldA, fieldB, fieldC) }
def doB = { some -> some.set(fieldX, fieldY, fieldZ) }


def doLoop(closure) {
    for ( a in someArray) {    
        doSomething

        closure(a)

        doSOmething
    }
}

doLoop doA

doLoop doB

答案 1 :(得分:0)

Groovy支持duck-typing。这意味着如果你的两个类set-method具有相同的签名,你只需在两个类上调用它:

class A {
  String x
}

class B {
  String x
}


list = [new A(), new B()]

def loop(def list) {
  for (e in list) {
    e.setX("myX of ${e.class}")
    println e.x
  }
}

loop(list)