Groovy:tap vs with
Groovy具有Groovy:tap vs with,groovy,Groovy,Groovy具有tap和以及函数。它们之间有什么区别 def user = new User('john', 1) .tap {userService.save(it)} def user2 = new User('Alex', 2) .with {userService.save(it)} userService更新记录并返回更新的记录 class UserService { public User save(final User user) {
tap
和以及函数。它们之间有什么区别
def user = new User('john', 1)
.tap {userService.save(it)}
def user2 = new User('Alex', 2)
.with {userService.save(it)}
userService
更新记录并返回更新的记录
class UserService {
public User save(final User user) {
// save user
return updated // Id, lastmodified and other fields can be updated.
}
}
如果userService.save(它)
返回一个布尔值
,用户
将是用户
,用户2
将是布尔值点击
始终返回它
无论是否有返回语句,但带
将返回上一条语句的结果返回
在您的问题中,user
将始终与new语句创建的对象相同。然而,user2
将是userService.save(it)
的返回值,Chayne的回答确实涵盖了这一点,我们应该让它被接受,但我想我会在“为什么我们实际上有两种不同的方法”中添加一个答案
使用tap,您可以执行以下操作:
def u = new User().tap {
firstName = "Brother"
lastName = "Bob"
}
不必像使用时那样显式返回它
:
def u = new User().with {
firstName = "Brother"
lastName = "Bob"
it
}
with
长期以来一直是groovy的一部分,tap
是一个较新的添加项,它明确支持这种“返回修改过的对象”模式
现在我们有了点击
,它将保留为
,这在这样的副作用场景中更合适:
server.with {
name = application.name
status = status
sessionCount = 3
start()
stop()
}
(示例无耻地从groovy文档中窃取)
我们对返回值不感兴趣,只想对一个对象执行一些操作
为了进一步混淆问题,groovy添加了一个变量with
,该变量带有一个布尔参数with(boolean returnIt)
其中xxx.with(true){}
将获得上面的tap
和xxx.with(false){}
将为您提供带有
且不带参数的行为。这似乎是您问题的答案: