我在Groovy中有一张现有的地图 我想创建一个具有相同键但不同值的新地图。
例如:
def scores = ["vanilla":10, "chocolate":9, "papaya": 0]
//transformed into
def preference = ["vanilla":"love", "chocolate":"love", "papaya": "hate"]
通过某种闭合来实现它,例如:
def preference = scores.collect {//something}
答案 0 :(得分:4)
您可以使用collectEntries
scores.collectEntries { k, v ->
[ k, 'new value' ]
}
使用map
作为范围的替代方法是使用switch
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 ) ] }
答案 1 :(得分:2)
漂亮的功能样式解决方案(包括您的范围,易于修改):
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]
答案 2 :(得分:1)
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]
编辑:如果你想要一张地图,那么你应该使用像tim_yates这样的collectEntries。