Map 如何从现有地图创建具有新值但键相同的新地图?

Map 如何从现有地图创建具有新值但键相同的新地图?,map,groovy,Map,Groovy,我在Groovy中已有一个映射。 我想创建一个具有相同键但不同值的新地图 例如: 通过某种形式的闭包,如: def preference = scores.collect {//something} 您可以使用collectEntries scores.collectEntries { k, v -> [ k, 'new value' ] } 对范围使用映射的替代方法是使用开关 def grade = { score -> switch( score ) {

我在Groovy中已有一个映射。
我想创建一个具有相同键但不同值的新地图

例如:

通过某种形式的闭包,如:

def preference = scores.collect {//something}

您可以使用
collectEntries

scores.collectEntries { k, v ->
    [ k, 'new value' ]
}
对范围使用
映射
的替代方法是使用
开关

def grade = { score ->
    switch( score ) {
        case 10..9: return 'love'
        case  8..6: return 'like'
        case  5..2: return 'meh'
        case  1..0: return 'hate'
        default   : return 'ERR'
    }
}

scores.collectEntries { k, v -> [ k, grade( v ) ] }
那么结果就是

[vanilla:like, chocolate:like, papaya:hate]

编辑:如果您想要地图,那么您应该使用tim_yates所说的collectEntries。

漂亮的功能性解决方案(包括您的范围,并且易于修改):


是的,你可以。你从哪里得到这些值(爱、爱、恨)?假设它是基于范围的
10..9=love,8..6=like,5..2=meh,1..0=hate
。我需要知道的是如何使用一个能够识别键值对的闭包,并为我生成更多的键值对,所有这些都将生成一个新的映射。
def scores = ["vanilla":10, "chocolate":9, "papaya": 0]

def preference = scores.collectEntries {key, value -> ["$key":(value > 5 ? "like" : "hate")]}
[vanilla:like, chocolate:like, papaya:hate]
def scores = [vanilla:10, chocolate:9, papaya: 0]
// Store somewhere
def map = [(10..9):"love", (8..6):"like", (5..2):"meh", (1..0):"hate"]
def preference = scores.collectEntries { key, score -> [key, map.find { score in it.key    }.value] }
// Output: [vanilla:love, chocolate:love, papaya:hate]