仅在Groovy中新值不为空或为null时指定映射条目的简明方法

时间:2016-02-04 05:52:03

标签: groovy gradle

我的gradle文件中有这段代码:

def itemA = getVar('ITEM_A')
if (itemA) {
    envmap['itemA'] = itemA
}

def itemB = getVar('ITEM_B')
if (itemB) {
    envmap['itemB'] = itemB
}

只有在新值不为空或为空时,是否有一种简洁的方式来分配变量?

2 个答案:

答案 0 :(得分:1)

您可以像这样写一个帮助器闭包:

def envHelper = { map, vkey, mkey ->
    getVar(vkey)?.with { v -> 
        envmap[mkey] = v
    }
}

然后,您可以替换

def itemA = getVar('ITEM_A')
if (itemA) {
    envmap['itemA'] = itemA
}

envHelper(envmap, 'ITEM_A', 'itemA')

答案 1 :(得分:0)

使用collectEntries和findAll获取Map。

//An example of keys corresponding to your query
def keyNameFromVarName(String varName){
   varName.toLowerCase().replace('_','').substring(0,varName.length()-2)+
   varName.substring(varName.length()-1,varName.length())
}

def varNames = ['ITEM_C', 'ITEM_D', 'ITEM_E', 'ITEM_F', 'ITEM_G', 'ITEM_H']

Map map = varNames.collectEntries{ [ (keyNameFromVarName(it)) : getVar(it) ] }.findAll{ k,v-> v }

首先在列表对象上使用collectEntries。请记住将地图密钥的生成放在括号内,否则会出现编译错误。

varNames.collectEntries{ [ (keyNameFromVarName(it)) : getVar(it) ] }

然后使用findAll获取值不为null的条目。将k,v定义为闭包的参数,以便于访问该值。

.findAll{ k,v-> v }