第一个Map是默认选项[a: true, b: false]。第二个Map-用户[a:false]传递的选项。Groovy是否有maps merge方法来获取[a: false, b:false]?在Groovy中实现它不是问题。我问的是开箱即用的方法
[a: true, b: false]
[a:false]
[a: false, b:false]
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添加到其中
<<
+
sbtkgmzw2#
除了使用加号(+)和左移(<<)运算符外,还可以使用**Map.withDefault(Closure)Groovy增强方法或Spread运算符(*)**:
Map.withDefault(Closure)
*
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默认都有相同的值,那么你可以这样写:
Map.withDefault
get(key)
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 ]
def defaults = [ a: true, b: false, ] def args = [ a: false, ] assert [ foo: "bar", *: defaults, *: args, ] == [ a: false, b: false, foo: "bar" ]
大致类似于加号运算符,但仅适用于Map文字。
近似等于Map m = new HashMap(); m.putAll(left); m.putAll(right); return m;。
Map m = new HashMap(); m.putAll(left); m.putAll(right); return m;
近似等于left.putAll(right); return left;。此外,您可以在类似于Map.withDefault的 Package 器函数中按需获取默认值:
left.putAll(right); return left;
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。
2条答案
按热度按时间fquxozlt1#
您可以使用plus:
或左移:
不同之处在于
<<
将右手Map添加到左手Map中。使用+
时,它会基于LHS构造一个新的Map,并将右侧Map添加到其中sbtkgmzw2#
除了使用加号(
+
)和左移(<<
)运算符外,还可以使用**Map.withDefault(Closure)
Groovy增强方法或Spread运算符(*
)**:Map.withDefault(Closure init)
Map.withDefault
使用装饰器模式 Package 一个map,并使用一个 Package 器拦截对get(key)
的所有调用。如果找到未知键,则在返回之前将默认值存储到Map中。存储的默认值将是调用所提供的Closure的结果,并将键作为Closure的参数。如果你要求Map中的每个boolean默认都有相同的值,那么你可以这样写:
Spread算子(
*
)大致类似于加号运算符,但仅适用于Map文字。
加运算符(
+
)近似等于
Map m = new HashMap(); m.putAll(left); m.putAll(right); return m;
。左移运算符(
<<
)近似等于
left.putAll(right); return left;
。此外,您可以在类似于
Map.withDefault
的 Package 器函数中按需获取默认值:Map.get(Object key,Object defaultValue)
对于不改变map的方法,可以考虑使用Map#getOrDefault(Object,Object)或考虑使用Groovy的MapWithDefault。