在Groovy中,仅当新值不为空或null时才分配映射项的简洁方法

在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

我的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 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值呢?顺便说一句,介意创建一个官方答案吗?很好的观点。。。下面是更正的答案