带冒号的 Groovy 扩展运算符映射语法

Vuk*_*pic 3 groovy

我想知道为什么这种语法对于传播列表和地图不一致。例如在这段代码中

def list =[1,2,3]
def map =[a:1,b:2]
println "${[*list]}"
println "${[*:map]}"
Run Code Online (Sandbox Code Playgroud)

列表以单个 * 展开,并以 * 进行映射:

它与传播运算符内部的工作方式有关吗?因为没有看到 *map 构造的任何其他用法(例如用 [:] 定义一个空映射,以便将它与列表区分开来)。

Pra*_*ete 7

展开运算符 (*) 用于从集合中提取条目并将它们作为单独的条目提供。

1.展开列表元素:

在列表字面量中使用时,展开运算符的作用就像将展开元素内容内联到列表中一样:

def items = [4,5]               
def list = [1,2,3,*items,6]             
assert list == [1,2,3,4,5,6] 
Run Code Online (Sandbox Code Playgroud)

来源:http : //docs.groovy-lang.org/latest/html/documentation/#_spread_list_elements

2. 展开地图元素:

扩展映射运算符的工作方式与扩展列表运算符类似,但用于映射。它允许您将地图的内容内联到另一个地图文字中,如下例所示:

def m1 = [c:3, d:4]         
def map = [a:1, b:2, *:m1] 
assert map == [a:1, b:2, c:3, d:4]?
Run Code Online (Sandbox Code Playgroud)

来源:http : //docs.groovy-lang.org/latest/html/documentation/#_spread_map_elements

  • 我发现等效的语法 `def map = [a:1, b:2] + m1` 更具可读性 (3认同)
  • 是的,我也是,但只是@Vuk 要求 `*:` 的重要性,所以我给了他一个例子。 (2认同)