Groovy 具有tap和with功能。它们之间有什么区别
def user = new User('john', 1)
.tap {userService.save(it)}
def user2 = new User('Alex', 2)
.with {userService.save(it)}
Run Code Online (Sandbox Code Playgroud)
userService 更新记录并返回更新的记录。
class UserService {
public User save(final User user) {
// save user
return updated // Id, lastmodified and other fields can be updated.
}
}
Run Code Online (Sandbox Code Playgroud)
查恩的答案确实涵盖了它,我们应该将其保留为已接受的,但我想我会添加一个答案“为什么我们实际上有两种不同的方法”。
使用 Tap,您可以执行以下操作:
def u = new User().tap {
firstName = "Brother"
lastName = "Bob"
}
Run Code Online (Sandbox Code Playgroud)
it不必像您必须的那样显式返回with:
def u = new User().with {
firstName = "Brother"
lastName = "Bob"
it
}
Run Code Online (Sandbox Code Playgroud)
with长期以来一直是 groovy 的一部分,tap是一个较新的添加,并且它明确支持这种“返回修改后的对象”模式。
现在我们有了tap,它with更适合像这样的副作用场景:
server.with {
name = application.name
status = status
sessionCount = 3
start()
stop()
}
Run Code Online (Sandbox Code Playgroud)
(示例从 groovy 文档中无耻地窃取)
我们对返回值不感兴趣,只想对对象执行一些操作。
为了进一步混淆事情,事实证明,groovy 添加了with带有布尔参数的 的变体with(boolean returnIt),其中将给你上面xxx.with(true) {}的行为,并且会给你没有参数的行为。tapxxx.with(false) {}with
tapit无论是否有 return 语句,总是返回,但with将返回您明确返回的最后一个语句或语句的结果。
在您的问题中,user将始终与 new 语句创建的对象相同。但是,user2将是返回值userService.save(it)
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |