Groovy:将两个只相差一行的函数重写为一行?

Groovy:将两个只相差一行的函数重写为一行?,groovy,closures,Groovy,Closures,假设我们有一个如下所示的循环: for (some a in someArray) { doSomething someClassA.set(fieldA, fieldB, fieldC) doSOmething } 及 可以不在Groovy中重复2循环块的描述吗 换句话说,我可以编写一个函数来完成这两项工作吗?您可以使用一个闭包来封装单行逻辑,并将其传递给一个方法,该方法循环并执行该块: def doA = { some -> some.set(fieldA, fie

假设我们有一个如下所示的循环:

for (some a in someArray) {    
 doSomething

 someClassA.set(fieldA, fieldB, fieldC)

 doSOmething
}

可以不在Groovy中重复2循环块的描述吗


换句话说,我可以编写一个函数来完成这两项工作吗?

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

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

Groovy支持duck类型。这意味着,如果两个类集合方法具有相同的签名,则只需在两个类上调用它:

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)

谢谢,但是如果fieldX不是原语,而是来自doLoop的一些变量的值,那么看起来我无法编译它。例如,fieldB实际上是someArray[3],它不会编译。我说的对吗?@MiamiBeach如果你能想出一些代码的话,会更容易得到帮助。就目前的代码来看,推广起来有点困难。我们需要知道那些
字段*
变量来自哪里。
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)