Scala - 在case语句保护中不使用null

时间:2017-02-04 21:23:25

标签: scala pattern-matching

我有一个功能

def withEnrichment[T](f: (AccountEnrichment) => Option[T] Or ErrorMessage) = 
        (Option(xa.getEnrichment) match {
    case None => Good(None)   
    case Some(e: AccountEnrichment) => f(e)
    case _ => Bad("not an AccountEnrichment")}) 
badMap {"enrichment: " + _}

我需要添加一个警卫,以便忽略某种类型的帐户。

case Some(g: AccountEnrichment) 
    if (g.getAccount != null && g.getAccount.getId == "BADACCOUNT") 
        => Bad("account: id cannot be BADACCOUNT")

这是有效的,但是我想在不使用null关键字的情况下这样做。 g.getAccount来自Java库,可以并且将为null。

2 个答案:

答案 0 :(得分:1)

当在null上应用Option时,它返回None。

scala> Option(null)
res0: Option[Null] = None

可以在代码中使用Option的此属性代替null比较。

case Some(g: AccountEnrichment) 
    if (Option(g.getAccount).isEmpty && g.getAccount.getId == "BADACCOUNT") 
        => Bad("account: id cannot be BADACCOUNT")

答案 1 :(得分:1)

如果您已经拥有case,我认为您不需要额外case Some(e: AccountEnrichment) => f(e)警卫。您可以将其修改为:

case Some(e: AccountEnrichment) => Option(e.getAccount)
    .filterNot(_.getId == "BADACCOUNT")
    .map(_ => f(e))
    .getOrElse(Bad("account: id cannot be BADACCOUNT"))