假设:
class Car {
String make
String model
}
def cars = [
new Car(make: 'Peugeot', model: '508'),
new Car(make: 'Renault', model: 'Clio')]
def makes = cars*.make
cars*.make
如何在java中的场景后面工作?它是否在堆中创建一个新的Map对象并组合两个映射?
答案 0 :(得分:4)
我查看了字节码,所涉及的唯一映射是为初始化Car
对象而创建的映射。
初始化两个汽车对象后,将它们放入列表中。点差运算符将(在这种情况下)转换为对ScriptBytecodeAdapter.getPropertySpreadSafe
的调用。
查看该方法的来源,您将看到它基本上只创建一个新的ArrayList
并添加每个对象的请求属性(在本例中为make
):
public static Object More ...getPropertySpreadSafe(Class senderClass, Object receiver, String messageName) throws Throwable {
if (receiver == null) return null;
List answer = new ArrayList();
for (Iterator it = InvokerHelper.asIterator(receiver); it.hasNext();) {
answer.add(getPropertySafe(senderClass, it.next(), messageName));
}
return answer;
}