在Groovy中的集合中对.findAll闭包进行赋值

时间:2014-08-12 22:52:15

标签: java grails groovy

我在Groovy中有一个集合,我使用.findAll()来过滤并返回一个较小的集合。假设我有一个Item表,我想根据它的某些属性进行过滤,例如:

 List<Item> items = Item.list();
 items.findAll { it.price > 0 }

说我添加了我想在这个闭包中添加额外的代码,如下所示:

 items.findAll {
     int roundedPrice = Math.ceil(it.price);
     roundedPrice > 0;
 }

根据Groovy docs,如果闭包返回true,闭包将过滤集合。但是,我很好奇的是,roundPrice的赋值是否会返回&#34; true&#34;在其自己的。

如代码所示,它有效。但是,是否有人知道在关闭时是否会出现问题?

3 个答案:

答案 0 :(得分:2)

  

但是,我很好奇的是,是否分配   roundedPrice将自行返回“true”。

你写它的方式,没有。您可以在闭包中发生任意数量的分配,这些分配不会直接影响返回值。闭包返回值将是闭包中最后一个表达式求值的值。如果将赋值设置为最后一个表达式,则只要赋值的结果为非零,它就会被视为“true”。

  

如代码所示,它有效。但是,有没有人知道是否   在封闭中有一项任务会有问题吗?

不,没有理由相信关闭在未来的表现会比现在有所不同。

答案 1 :(得分:2)

您已指出正在从数据库加载项目。实现相同结果的更有效方法是

Item.findAllByPriceGreaterThan(0)

当您在查询中进行过滤时,从数据库返回所有项目然后在内存中过滤它们是低效的。

答案 2 :(得分:1)

不应该 - 但你也可以items.findAll {Math.ceil(it.price) > 0}