作为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中处理这种简单案例的最佳做法是什么?我已经知道flatMap并flatten处理集合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元素的集合.
这应该完成你想要做的事情:
items.get(coords).foreach{ item =>
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
查看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)