Groovy:点击与使用

Yan*_*ski 2 groovy

Groovy 具有tapwith功能。它们之间有什么区别

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)

Mat*_*and 8

查恩的答案确实涵盖了它,我们应该将其保留为已接受的,但我想我会添加一个答案“为什么我们实际上有两种不同的方法”。

使用 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


Cha*_* S. 6

tapit无论是否有 return 语句,总是返回,但with将返回您明确返回的最后一个语句或语句的结果。

在您的问题中,user将始终与 new 语句创建的对象相同。但是,user2将是返回值userService.save(it)