Groovy List参数问题:+ =不起作用但.add()起作用

Amo*_*eba 3 groovy

public updateList(lst) {
  lst += "a"
}

List lst = []
updateList(lst)
println(lst)
Run Code Online (Sandbox Code Playgroud)

这会打印一个空列表.然而;

public updateList(lst) {
  lst.add("a")
}

List lst = []
updateList(lst)
println(lst)
Run Code Online (Sandbox Code Playgroud)

,将根据需要打印"a".

我一直认为+ =与.add()相同,但显然不是.我假设+ =正在创建一个新的List,而.add()只更新了现有的List?

tim*_*tes 7

第一种方法调用plus在lst可变

正如我们从文档中看到的那样,这将:

创建集合作为集合和对象的联合.

因此将返回一个新集合,原始lst(在此方法范围之外)将保持不变.(显然,在这个方法的范围内,lst将是一个包含一个元素的新列表)

这可以通过打印出updateList方法的结果来看出:

public updateList(lst) {
  lst += "a"  // calls plus, creates a new list, and returns this new list.
              // lst (outside the context of this method) is unmodified
}

List lst = []
println( updateList(lst) )
Run Code Online (Sandbox Code Playgroud)

如果你打电话add,那么你调用标准的java add方法.

public updateList(lst) {
  lst.add "a"
}
Run Code Online (Sandbox Code Playgroud)

所以原件lst被修改了

另一种方法add是使用leftShift运算符:

public updateList(lst) {
  lst << "a"
}
Run Code Online (Sandbox Code Playgroud)

幕后添加哪些调用:(来自Groovy主干源的代码)

public static <T> Collection<T> leftShift(Collection<T> self, T value) {
    self.add(value);
    return self;
}
Run Code Online (Sandbox Code Playgroud)