当使用操作符重载时,在闭包中或甚至在方法中更新时,不会发生对我的列表的java更新
看起来,当您将列表传递到方法/闭包中时,Groovy会在闭包或方法中创建列表的副本,并进行更新,以便退出后不会反映您的更改!!!如果使用,则情况并非如此。添加方法
Groovy为什么要改变这一最直观的行为 Java开发人员在与运算符一起使用列表加法时 超载+符号
Groovy的观点有什么好处
如果我在代码示例中取消注释增强的for循环,并使用+号注释掉添加的列表,它的行为与预期的一样
*
List<String> b = ['man', 'lady']
def x = { List<String> p ->
println delegate.getClass().getName()
List<String> inx = ['dog','cat']
/*for (String l : inx)
{
p.add(l)
}*/
p = p + inx //value of p is not reflected whence you exit
}
def xmethod(List<String> p)
{
List<String> inx = ['monkey','lion']
/*for (String l : inx)
{
p.add(l)
}*/
p = p + inx // value of p is not reflected whence you exit
}
x( b )
println b
xmethod( b )
println b
# 1 楼答案
给定:
p = p + inx
其中p
,inx
是列表这可以理解为:
p = p.plus(inx)
,在Groovy中是重载的 方法返回传递的列表的新副本,当然 将在内存中有一个新地址。因此,它不会更新 传入的列表当该方法返回并从堆栈中返回时,将在其中创建列表 被移除,并且不再存在
在使用
p.plus(inx)
或p + inx
时,这非常重要 特别是如果p被传递到方法中,并且您希望 要反映回传递给的原始p
的更改 改用p.addAll(inx)
方法顺便说一句,地图也是如此,请参阅:Groovy (or Java) - Pass by reference into a wrapper object