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

带冒号的Groovy spread运算符映射语法,groovy,Groovy,我想知道为什么这种语法在传播列表和地图时不一致。例如,在本代码中 def list =[1,2,3] def map =[a:1,b:2] println "${[*list]}" println "${[*:map]}" 列表以单个*展开,地图以*展开: 它是否与spread operator内部的工作方式有关?因为没有看到*map构造的任何其他用法(例如用[:]定义空映射有助于将其与列表区分开来)。使用扩展运算符(*)从集合中提取条目,并将其作为单个条目提供 1。排列列表元素: 在列表文字

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

def list =[1,2,3]
def map =[a:1,b:2]
println "${[*list]}"
println "${[*:map]}"
列表以单个*展开,地图以*展开:

它是否与spread operator内部的工作方式有关?因为没有看到*map构造的任何其他用法(例如用[:]定义空映射有助于将其与列表区分开来)。

使用扩展运算符(*)从集合中提取条目,并将其作为单个条目提供

1。排列列表元素:

在列表文字中使用时,排列运算符的作用就像排列元素内容内联到列表中一样:

def items = [4,5]               
def list = [1,2,3,*items,6]             
assert list == [1,2,3,4,5,6] 
资料来源:

2。分布图元素:

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

def m1 = [c:3, d:4]         
def map = [a:1, b:2, *:m1] 
assert map == [a:1, b:2, c:3, d:4]​

来源:

*:
只是一个操作符,就像
*
?:
+
。。。这与它的内部工作方式无关,它只是扩展映射的操作符的“名称”。我找到了等价的语法
defmap=[a:1,b:2]+m1
更易于阅读。是的,我也是,但@Vuk要求
*:
的重要性,所以我给了他一个例子。谢谢你的回答。我已经阅读了文档,但问题是为什么同一个操作符在一种情况下使用*而在另一种情况下使用*:符号。由于groovy倾向于尽可能地简化事情,我想肯定有一个很好的理由。我不确定groovy creator为什么保持这种方式,但由于
Map
表示为
key:value
对,所以他们一定考虑过保持它
*:
,因为Map包含