一种Groovy-rific方法一次创建多个对象?

时间:2017-01-10 07:08:25

标签: groovy

这可能是一个微不足道的问题,但我对Groovy来说相对较新。

说我有一个简单的POJO:

class Ident {
    String a,
    String b,
    String c
}

接下来,我在另一个类上有这样的函数:

void select(Ident ... idents) {
    // do something for each ident
}

现在,我只是用Java方式做这件事:

blah.select(new Ident(a1, b1, c1),
            new Ident(a2, b2, c2),
            ...
            new Ident(aN, bN, cN))

显然,我缩短了名字。

我只是想知道是否有Groovy-ier方式重做这个。或者是这样吗?

我知道那里有一个基于地图的构造函数,但我认为这更加冗长。

1 个答案:

答案 0 :(得分:1)

如果您有一个以正确顺序获取所有args的构造函数,或者您可以间接使用map构造函数,则可以在列表中使用spread运算符:

import groovy.transform.TupleConstructor

@TupleConstructor // add constructor Ident(a,b,c)
class Ident {
    String a
    String b
    String c
}

def argLists = [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2']]

argLists.collect { new Ident(*it) } //spread

argLists.collect { it as Ident } // list coercion

argLists.collect { 
    def map = [['a', 'b', 'c'], it].transpose().collectEntries() 
    new Ident(map) // map constructor
}

argLists.collect { 
    [['a', 'b', 'c'], it].transpose().collectEntries() as Ident // map coercion
}