Groovy有合并两个map的方法吗?

xzabzqsa  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(198)

第一个Map是默认选项[a: true, b: false]。第二个Map-用户[a:false]传递的选项。Groovy是否有maps merge方法来获取[a: false, b:false]
在Groovy中实现它不是问题。我问的是开箱即用的方法

fquxozlt

fquxozlt1#

您可以使用plus:

assert [ a: true, b: false ] + [ a: false ] == [ a: false, b: false ]

或左移:

assert [ a: true, b: false ] << [ a: false ] == [ a: false, b: false ]

不同之处在于<<将右手Map添加到左手Map中。使用+时,它会基于LHS构造一个新的Map,并将右侧Map添加到其中

sbtkgmzw

sbtkgmzw2#

除了使用加号(+)和左移(<<)运算符外,还可以使用**Map.withDefault(Closure)Groovy增强方法或Spread运算符(*)**:

Map.withDefault(Closure init)

def defaults = [ a: true, b: false, ]
def args = [ a: false, ]
def options = args.withDefault { defaults[it] }

assert options == [ a: false ]
assert [ options["a"], options["b"] ] == [ false, false ]
assert options == [ a: false, b: false ]

Map.withDefault使用装饰器模式 Package 一个map,并使用一个 Package 器拦截对get(key)的所有调用。如果找到未知键,则在返回之前将默认值存储到Map中。存储的默认值将是调用所提供的Closure的结果,并将键作为Closure的参数。
如果你要求Map中的每个boolean默认都有相同的值,那么你可以这样写:

def args = [ a: true, ]
def options = args.withDefault { false }

assert options == [ a: true ]
assert [ options["a"], options["b"], options["c"] ] == [ true, false, false ]
assert options == [ a: true, b: false, c: false ]

Spread算子(*

def defaults = [ a: true, b: false, ]
def args = [ a: false, ]

assert [ foo: "bar", *: defaults, *: args, ] == [ a: false, b: false, foo: "bar" ]

大致类似于加号运算符,但仅适用于Map文字。

加运算符(+

assert [ a: true, b: false ] + [ a: false ] == [ a: false, b: false ]

近似等于Map m = new HashMap(); m.putAll(left); m.putAll(right); return m;

左移运算符(<<

assert [ a: true, b: false ] << [ a: false ] == [ a: false, b: false ]

近似等于left.putAll(right); return left;
此外,您可以在类似于Map.withDefault的 Package 器函数中按需获取默认值:

Map.get(Object key,Object defaultValue)

def defaults = [ a: true, b: false, ]
def args = [ a: false, ]
assert args.get("a", defaults["a"]) == false
assert args.get("b", defaults["b"]) == false

对于不改变map的方法,可以考虑使用Map#getOrDefault(Object,Object)或考虑使用Groovy的MapWithDefault。

  • 加号和Shift运算符部分的灵感来自Tim Yates的答案。
  • 查看Groovy的Enhancement Map文档以获得更好的理解。

相关问题