Groovy*。操作员
最近我在读《Groovy在行动》。第7章介绍了*。操作人员当我运行关于这个操作符的代码时,我会犯一些错误Groovy*。操作员,groovy,Groovy,最近我在读《Groovy在行动》。第7章介绍了*。操作人员当我运行关于这个操作符的代码时,我会犯一些错误 class Invoice { List items Date date }
class Invoice {
List items
Date date
}
class LineItem {
Product product
int count
int total() {
return product.dollar * count
}
}
class Product {
String name
def dollar
}
def ulcDate = new Date(107,0,1)
def ulc = new Product(dollar:1499, name:'ULC')
def ve = new Product(dollar:499, name:'Visual Editor')
def invoices = [
new Invoice(date:ulcDate, items: [
new LineItem(count:5, product:ulc),
new LineItem(count:1, product:ve)
]),
new Invoice(date:[107,1,2], items: [
new LineItem(count:4, product:ve)
])
]
//error
assert [5*1499, 499, 4*499] == invoices.items*.total()
最后一行将抛出异常。
首先,我可以解释为什么会发生这种错误。发票是一个列表,元素的类型是发票。因此,直接使用项目将产生错误。我尝试使用invoices.collect{it.items*.total()}
但仍然得到一个失败断言。那么,如何使断言成功,以及为什么invoices*.items*.total()将引发异常。invoices*运算符的结果是一个列表,因此
invoices*.items
的结果是一个列表flatte()
可以应用于列表并返回一个平面列表,因此您可以使用它从列表项的列表中创建行项的列表。然后,可以使用扩展运算符将total()
应用于其元素:
assert [5*1499, 499, 4*499] == invoices*.items.flatten()*.total()
这并不能回答您的问题,但最好在Invoice类中使用total方法,如下所示:
int total() {
items*.total().sum()
}
然后,您可以通过以下方式进行检查:
assert [5*1499 + 499, 4*499] == invoices*.total()