加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 比较Option [T]的实例,避免None == None

发布时间:2020-12-16 08:54:23 所属栏目:安全 来源:网络整理
导读:昨天我突然被启发并了解人们如何以及为什么人们使用’map’方法和Option来比较值.是的,我有点慢,抱歉:) 我修改了这些非常好的链接,并提出了我想问的问题. http://twitter.github.com/effectivescala http://blog.tmorris.net/posts/scalaoption-cheat-sheet
昨天我突然被启发并了解人们如何以及为什么人们使用’map’方法和Option来比较值.是的,我有点慢,抱歉:)

我修改了这些非常好的链接,并提出了我想问的问题.

http://twitter.github.com/effectivescala

http://blog.tmorris.net/posts/scalaoption-cheat-sheet

在我的Lift webapp中,我有一些Option [User]和Option [Server]变量.我试图通过以下检查找出此用户是否是此服务器的管理员

if(user.map(_.id) == server.map(_.adminId))

但是我注意到,如果’user’是None而’server’也是None,那么这个检查成功,这对我不利(如果它们中的任何一个是None,我希望这个检查失败).我可以添加user.isDefined条件,但我觉得有更多正确的方法来做到这一点.你能告诉我如何用Scala方式完成它吗?

解决方法

你可以用模式匹配(在这种情况下可能是最清晰的方式)来做到这一点:

(user,server) match {
  case (Some(user),Some(server)) if user.id == server.adminId =>
    // both ids are matching,handle this case here
  case _ =>
    // no match,handle this case here
}

你也可以尝试作为一个单行,但在这里我不建议它,因为它是非常混淆:

if ( user.flatMap{ user => server.map(_.adminId == user.id) }.getOrElse( false ) ) {
  // both ids are matching,handle this case here
}
else {
  // no match,handle this case here
}

最后,如果你只需要处理id匹配的情况(如果没有则只会做任何事情),使用for comprehension对于一个选项来说并不是太糟糕(没有双关语):

for ( user <- user; server <- server if user.id == server.adminId ) {
  // both ids are matching,handle this case here
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读