作为一个Java到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)
}
}我想它看起来很难看,看起来真的像一段从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中没有看到类似的东西。
发布于 2012-12-18 20:59:13
非常流行的使用模式:
val item: Option[Int] = None
val result = item map (_ + 1) getOrElse 0因此,您只需使用map来转换定义的值。
如果您只想使用存储在Option中的值,那么只需使用foreach
item foreach { it =>
println(it)
}如您所见,Option还支持许多集合方法,因此实际上不需要学习新的API。您只需将其视为包含1或0元素的集合。
发布于 2012-12-18 20:56:35
这应该能完成你想要做的事情:
items.get(coords).foreach{ item =>
//do stuff
}发布于 2012-12-19 00:06:30
看看这个托尼莫里斯帖子。当我试图理解选项时,这对我有很大的帮助。您的代码可以这样重写:
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)
}
}https://stackoverflow.com/questions/13941317
复制相似问题