在Groovy中,仅当新值不为空或null时才分配映射项的简洁方法
我的gradle文件中到处都是这段代码:在Groovy中,仅当新值不为空或null时才分配映射项的简洁方法,groovy,gradle,Groovy,Gradle,我的gradle文件中到处都是这段代码: def itemA = getVar('ITEM_A') if (itemA) { envmap['itemA'] = itemA } def itemB = getVar('ITEM_B') if (itemB) { envmap['itemB'] = itemB } 只有当新值不为null或空时,才有更简洁的方法分配给变量吗?使用collectEntries和findAll获得映射 //An example of keys cor
def itemA = getVar('ITEM_A')
if (itemA) {
envmap['itemA'] = itemA
}
def itemB = getVar('ITEM_B')
if (itemB) {
envmap['itemB'] = itemB
}
只有当新值不为null或空时,才有更简洁的方法分配给变量吗?使用collectEntries和findAll获得映射
//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 }
使用collectEntries和findAll获取地图
//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 }
您可以编写一个助手闭包,如下所示:
def envHelper = { map, vkey, mkey ->
getVar(vkey)?.with { v ->
envmap[mkey] = v
}
}
然后,您可以替换
def itemA = getVar('ITEM_A')
if (itemA) {
envmap['itemA'] = itemA
}
与
您可以编写一个助手闭包,如下所示:
def envHelper = { map, vkey, mkey ->
getVar(vkey)?.with { v ->
envmap[mkey] = v
}
}
然后,您可以替换
def itemA = getVar('ITEM_A')
if (itemA) {
envmap['itemA'] = itemA
}
与
你不能只写一个函数来包装这个功能吗?我可以这样做吗?:setOnlyIfNonEmpty(envmap['itemB'],'ITEM_B')当然,像
def envHelper={map,vkey,mkey->getVar(vkey)。使用{v->envmap[mkey]=v}
然后用envHelper(envmap,'ITEM_a',itemA')
调用它,谢谢,太棒了。我不知道你可以用地图来做。现在,如果getVar()可能会返回null值呢?顺便说一句,介意创建一个官方答案吗?很好的观点。。。下面是正确答案。你能写一个函数来包装这个功能吗?我可以这样做吗?:setOnlyIfNonEmpty(envmap['itemB','ITEM_B')当然,类似于def envHelper={map,vkey,mkey->getVar(vkey)。使用{v->envmap[mkey]=v}
然后用envHelper调用它(envmap,'ITEM_a',itemA'))
谢谢,太棒了。我不知道你可以用地图来做。现在,如果getVar()可能会返回null值呢?顺便说一句,介意创建一个官方答案吗?很好的观点。。。下面是更正的答案