假设在一个长列表中评估每个或任何方法,并且第一个元素上的闭包值足以确定最终结果(对于any,为true,对于每个都为false)。这些方法是否继续处理列表的其余元素,还是立即返回?
def lst = [1,2,3,4]
//Do either of these functions evaluate the 2nd, 3rd and 4th element of lst?
boolean value1 = lst.any{element -> element == 1}
boolean value2 = lst.every {element -> element == 2}
答案 0 :(得分:2)
any()
和every()
短路并尽快返回。
您可以在any()
和every()
的来源中看到这一点。这些方法每个迭代遍历评估闭包的每个对象,如果条件是(对于any()
)/不是(对于every()
),则返回。
答案 1 :(得分:-1)
是和否。您的帖子中的第一个闭包 - any
- 会使第一个值短路,使其评估为真。然而,闭合every
不能通过设计和逻辑短路;它必须扫描每个值以确保它满足指定的条件,在您的情况下element == 2
。使用Groovy web console进行测试。不要忘记添加assert
语句或println value1; println value2
来查看结果。
更新:回答太快了。两者都会短路。如果every
遇到使其评估为false的内容,它将会短路。抱歉。我值得投票: - (