【问题标题】:Having trouble with Options选项有问题
【发布时间】:2016-09-24 20:56:02
【问题描述】:

我觉得我在这里使用了不正确的选项,但看不到如何正确使用 getOrElse 以便我的条件有效。

当前错误代码:

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

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

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

【问题讨论】:

标签: scala


【解决方案1】:

你可以使用map

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

map 中的代码只有在OptionSome 时才会执行。它将 Option 类型视为具有一个或没有元素的列表。当您映射到一个空列表时,您只会得到一个空列表;当你映射一个单元素列表时,你会得到一个新的单元素列表,但有一个映射值

【讨论】:

  • getWheel 不幸返回一个轮子,但我也看不出映射如何摆脱潜在的无?
  • 酷,不知道地图怎么样。谢谢,标记为答案。
【解决方案2】:

我倾向于使用地图来分隔我的案例。 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)

【讨论】:

  • 这行不通——你的意思可能是match 而不是map——无论如何case _ 在我看来通常是一种反模式。如果您还没有处理所有情况,请让编译器告诉您。
  • 哎呀你是绝对正确的,改变它来匹配。至于case_,我确实认为有它的位置。它可以代表所有不关心的情况。例如,如果有 10 个案例,但您只关心第一个.. 使用默认案例简单处理其他 9 个
猜你喜欢
  • 1970-01-01
  • 2022-10-08
  • 2018-12-18
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多