我觉得我在这里使用的选项不正确,但无法正确使用getOrElse,以便我的条件有效。
当前的错误代码:
if (car.getWheel.isDefined) {
car.getWheel.get.getHubCap.isShinierThan(hubcap2)
}
else {
// Do nothing
}
我想使用像getOrElse这样简单的东西,而不是使用if语句和使用' .get'这种丑陋的组合。匹配表达式将与if语句执行相同的操作,但是再次占用三行并且基本上是重新发明Option。 Option中有一些方法让我对Nones什么都不做?
我的目标:如果该选项包含无,我希望让代码行完成 nothing 。我不想在getOrElse的某个参数上调用getHubCap。
答案 0 :(得分:4)
您可以使用map
:
val result: Option[Boolean] = car.getWheel.map(_.getHubCap.isShinierThan(hubcap2))
map
内的代码仅在Option
为Some
时执行。它将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)