我在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;在其自己的。
如代码所示,它有效。但是,是否有人知道在关闭时是否会出现问题?
答案 0 :(得分:2)
但是,我很好奇的是,是否分配 roundedPrice将自行返回“true”。
你写它的方式,没有。您可以在闭包中发生任意数量的分配,这些分配不会直接影响返回值。闭包返回值将是闭包中最后一个表达式求值的值。如果将赋值设置为最后一个表达式,则只要赋值的结果为非零,它就会被视为“true”。
如代码所示,它有效。但是,有没有人知道是否 在封闭中有一项任务会有问题吗?
不,没有理由相信关闭在未来的表现会比现在有所不同。
答案 1 :(得分:2)
您已指出正在从数据库加载项目。实现相同结果的更有效方法是
Item.findAllByPriceGreaterThan(0)
当您在查询中进行过滤时,从数据库返回所有项目然后在内存中过滤它们是低效的。
答案 2 :(得分:1)
不应该 - 但你也可以items.findAll {Math.ceil(it.price) > 0}