6

我最近正在阅读“Groovy in Action”。在第 7 章中,它介绍了 *. 操作员 。当我运行有关此运算符的代码时,我遇到了一些错误。

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()  

最后一行将引发异常。首先,我可以解释为什么会发生这个错误。发票是一个列表,元素的类型是发票。所以直接使用items会报错。我尝试通过使用来修复它invoices.collect{it.items*.total()}

但仍然得到一个失败的断言。那么,我怎样才能使断言成功以及为什么 invoices*.items*.total() 会抛出异常。

4

2 回答 2

7

invoices*.operator的结果是一个列表,所以 of 的结果invoices*.items是一个列表的列表。flatten()可以应用于列表并返回一个平面列表,因此您可以使用它LineItems从您的列表列表中创建一个列表ListItems。然后,您可以 total()使用扩展运算符应用于其元素:

assert [5*1499, 499, 4*499] == invoices*.items.flatten()*.total()
于 2012-05-23T07:10:39.250 回答
5

这不能回答您的问题,但在您的 Invoice 类中也有一个总方法可能是更好的做法,如下所示:

int total() {
  items*.total().sum()
}                        

然后,您可以通过以下方式检查:

assert [5*1499 + 499, 4*499] == invoices*.total()  
于 2012-05-23T08:17:58.337 回答