【问题标题】:Groovy null and isEmpty checks on child collectionsGroovy null 和 isEmpty 检查子集合
【发布时间】:2016-06-26 21:34:50
【问题描述】:

我有以下用户类:

class User {
    String username
    Set<Role> roles
}

在应用程序中,我调用SecurityUtils.getUser() 来获取当前登录的用户。如果用户已登录,则此方法返回有效的 User 实例,如果用户未验证/匿名,则返回 null

User user = SecurityUtils.getUser()

我正在尝试编写一个方法,我需要确定用户是否登录,如果他们登录了,如果他们的Roles 集为空或null,我需要做一些特殊的事情:

if(user && !user.roles) {
    // Do something special
}

我想做这个 Groovier,所以我尝试了:

if(!user?.roles) {
    // Do something special  
}

这是行不通的。同样,// Do something special 应该在以下情况下执行:

  1. user 不为空(已验证);和 (
  2. 有一组为空的Roles;或
  3. 有一组Roles 是空的)

有什么想法吗?

【问题讨论】:

  • 是什么让你相信user &amp;&amp; !user.roles 不时髦?
  • 这样使用。无论你想出什么“聪明”的东西,都比user &amp;&amp; !user.roles 可读性差。让我们假设!user?.roles 有效。一般开发人员需要多长时间才能理解这种情况的意图?
  • 大声笑——这一定是历史上第一次 Groovy 人推荐使用更重的语法!
  • @smeeb Groovy 的目的不是让每个句子都尽可能小。

标签: groovy


【解决方案1】:

如果usernull,则user?.roles 的计算结果为null!user?.roles 的计算结果为!null,即true,因此这与您的第一个条件相冲突。

如果user 不是null,则user?.roles 等价于user.roles,在这种情况下所有条件都满足。

结论:使用user &amp;&amp; !user.roles。我同意 cmets,这更具可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2017-12-23
    • 2013-06-19
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多