首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy: tap vs with

Groovy: tap vs with
EN

Stack Overflow用户
提问于 2020-05-12 12:13:42
回答 3查看 2K关注 0票数 5

Groovy具有tapwith函数。他们之间有什么区别?

代码语言:javascript
复制
def user = new User('john', 1)
        .tap {userService.save(it)}

def user2 = new User('Alex', 2)
        .with {userService.save(it)}

userService更新记录并返回更新的记录。

代码语言:javascript
复制
class UserService {
    public User save(final User user) {
        // save user
        return updated // Id, lastmodified and other fields can be updated.
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-10-29 18:44:42

无论是否有返回语句,tap总是返回it,但是with将返回您显式返回的最后一条语句或语句的结果。

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

票数 8
EN

Stack Overflow用户

发布于 2020-11-02 10:05:04

Chayne的回答确实涵盖了这个问题,我们应该把它保留下来,但我想我会给“为什么我们实际上有两种不同的方法”加上一个答案。

有了水龙头,你就可以做以下事情:

代码语言:javascript
复制
def u = new User().tap {
  firstName = "Brother"
  lastName = "Bob"
}

而不必像使用it时那样显式地返回with

代码语言:javascript
复制
def u = new User().with {
  firstName = "Brother"
  lastName = "Bob"
  it
}

with长期以来一直是groovy的一部分,tap是一个较新的添加,它显式地支持这种“返回修改后的对象”模式。

现在我们已经有了tap,它使with更适合于这样的侧影响场景:

代码语言:javascript
复制
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的行为。

票数 4
EN

Stack Overflow用户

发布于 2020-05-12 13:29:28

如果userService.save(it)返回一个boolean,那么user将是一个Useruser2将是一个boolean

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61751440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档