Groovy:tap vs with

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) {

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) {
        // 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){}
将为您提供带有
且不带参数的行为。

这似乎是您问题的答案: