选项遇到问题

时间:2016-09-24 20:56:03

标签: scala

我觉得我在这里使用的选项不正确,但无法正确使用getOrElse,以便我的条件有效。

当前的错误代码:

if (car.getWheel.isDefined) {
    car.getWheel.get.getHubCap.isShinierThan(hubcap2)
}
else {
    // Do nothing
}

我想使用像getOrElse这样简单的东西,而不是使用if语句和使用' .get'这种丑陋的组合。匹配表达式将与if语句执行相同的操作,但是再次占用三行并且基本上是重新发明Option。 Option中有一些方法让我对Nones什么都不做?

我的目标:如果该选项包含无,我希望让代码行完成 nothing 。我不想在getOrElse的某个参数上调用getHubCap。

2 个答案:

答案 0 :(得分:4)

您可以使用map

val result: Option[Boolean] = car.getWheel.map(_.getHubCap.isShinierThan(hubcap2))

map内的代码仅在OptionSome时执行。它将Option类型视为包含一个或没有元素的列表。当您在空列表上映射时,您只需返回一个空列表;当您在单个元素列表上映射时,您将获得一个新的单元素列表,但具有映射值

答案 1 :(得分:0)

我倾向于用map来分隔我的案例。 case _可能很重要,因为它是默认情况,如果之前的案例都不匹配,则匹配。这使您可以以预测方式编码并处理所有边缘情况。

正如您所看到的那样,也可以通过在case语句中使用if子句来添加条件。

val opt: Option[String] = Some("foo")

val printString: String = opt match {
  case Some(string) if string == "bar" => string
  case Some(string) => string
  case _ => "none"
} 

println(printString)