Scala最佳实践:简单的Option []用法

Gre*_*Cat 9 null scala

作为Java-to-Scala切换器,我经常发现自己重写了处理类似的东西

val itemOpt: Option[Item] = items.get(coords) // "items" is something like a Map
if (itemOpt.isDefined) {
  val item = itemOpt.get
  // do something with item, querying item fields a lot of times, for example
  if (item.qty > 10) {
    storeInVault(item.name, item.qty, coords)
  } else {
    storeInRoom(item)
  }
}
Run Code Online (Sandbox Code Playgroud)

我想这长相丑陋,它真的看起来像Java的重写一段代码:

Item item = items.get(coords);
if (item != null) {
  // do something with item, querying item fields a lot of times, for example
}
Run Code Online (Sandbox Code Playgroud)

它在Java中看起来也很难看,但至少它只有一行.在Scala中处理这种简单案例的最佳做法是什么?我已经知道flatMapflatten处理集合Option[Stuff],我知道getOrElse处理默认值.我的梦想是这样的:

items.get(coords).doIfDefined(item =>
  // do stuff with item
)
Run Code Online (Sandbox Code Playgroud)

但是在OptionAPI中我没有看到类似的东西.

ten*_*shi 12

非常流行的使用模式:

val item: Option[Int] = None
val result = item map (_ + 1) getOrElse 0
Run Code Online (Sandbox Code Playgroud)

所以你只是使用map它来定义变换值.

如果你只想使用存储在a中的值Option,那么只需使用foreach:

item foreach { it =>
    println(it)
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Option还支持许多集合方法,因此您实际上不需要学习新的API.您可以将其视为具有1或0元素的集合.


jce*_*ern 7

这应该完成你想要做的事情:

items.get(coords).foreach{ item => 
  //do stuff
}
Run Code Online (Sandbox Code Playgroud)

  • 或者,只需使用for(for <item> - maybeItem){...}`,其中`maybeItem`是你的选择. (6认同)

Ser*_*nko 5

查看Tony Morris的帖子.当我试图了解Option时,它对我非常有帮助.您的代码可能会以这样的方式重写:

for (item <- items.get(coords)) { // "items" is something like a Map
  // do something with item, querying item fields a lot of times, for example
  if (item.qty > 10) {
    storeInVault(item.name, item.qty, coords)
  } else {
    storeInRoom(item)
  }
}
Run Code Online (Sandbox Code Playgroud)