作为Java转Scala的人,我经常会重写空值处理相关的代码,比如:
我猜它看起来很丑,而且它真的看起来像是从Java重新编写的代码:
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)
}
}
我猜它看起来很丑,而且它真的看起来像是从Java重新编写的代码:
Item item = items.get(coords);
if (item != null) {
// do something with item, querying item fields a lot of times, for example
}
在Java中,这看起来也很丑,但至少可以少一行代码。在Scala中,如何处理这样简单的情况最佳实践是什么?我已经知道了使用 flatMap
和 flatten
处理Option[Stuff]
集合,以及使用 getOrElse
处理默认值。我梦想有一个像这样的函数:
items.get(coords).doIfDefined(item =>
// do stuff with item
)
但是在Option
API中我没有看到类似的内容。