Groovy具有tap和with函数。他们之间有什么区别?
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.
}
}发布于 2020-10-29 18:44:42
无论是否有返回语句,tap总是返回it,但是with将返回您显式返回的最后一条语句或语句的结果。
在您的问题中,user将始终与新语句创建的对象相同。但是,user2将是userService.save(it)的返回值。
发布于 2020-11-02 10:05:04
Chayne的回答确实涵盖了这个问题,我们应该把它保留下来,但我想我会给“为什么我们实际上有两种不同的方法”加上一个答案。
有了水龙头,你就可以做以下事情:
def u = new User().tap {
firstName = "Brother"
lastName = "Bob"
}而不必像使用it时那样显式地返回with
def u = new User().with {
firstName = "Brother"
lastName = "Bob"
it
}with长期以来一直是groovy的一部分,tap是一个较新的添加,它显式地支持这种“返回修改后的对象”模式。
现在我们已经有了tap,它使with更适合于这样的侧影响场景:
server.with {
name = application.name
status = status
sessionCount = 3
start()
stop()
}(例如无耻地从groovy文档中窃取)
我们对返回值不感兴趣,只想对一个对象执行一些操作。
更让人困惑的是,groovy添加了一个with的变体和一个布尔参数with(boolean returnIt),其中xxx.with(true) {}将为您提供上面tap的行为,而xxx.with(false) {}则会给出不带参数的with的行为。
发布于 2020-05-12 13:29:28
如果userService.save(it)返回一个boolean,那么user将是一个User,user2将是一个boolean
https://stackoverflow.com/questions/61751440
复制相似问题