避免在Scala中使用可变变量是一种很好的做法。
来自“Scala编程,第2版”,第52页:“Scala允许您以强制性的方式编程,但鼓励您采用更具功能性的风格”,后来“Scala鼓励您倾向于使用val,但最终考虑到手头的工作,找到最好的工具。“
如何在Scala中使这个命令式构造变得优雅(专注于变量 count ):
var count = 0
val foo = getRequest()
if(foo.isJsonObject){
count = doSomething(foo)
}
if(count>0){
specialCall()
} else{
defaultCall()
}
您使用什么构造或模式将命令式样式转换为功能样式? 您是否使用了Option类或其他一些构造?
答案 0 :(得分:4)
不确定您是否提供了足够的上下文,但是:
val foo = getRequest()
val count = if (foo.isJsonObject) doSomething(foo) else 0
if (count > 0) {
specialCall()
} else {
defaultCall()
}
通常,Scala API一般(集合,Option
,Try
,Future
等)及其操作(map
,flatMap
,{ {1}},filter
等)允许您非常简洁地表达大多数命令式结构。
答案 1 :(得分:2)
@ ale64bit答案很好,但你可以表达更短
val foo = getRequest()
if (foo.isJsonObject && doSomething(foo)>0)
specialCall()
else
defaultCall()
答案 2 :(得分:1)
有很多方法可以做到这一点。
val count = Try(getRequest).filter(_.isJsonObject).map(doSomething).getOrElse(0)
if (count > 0) {
specialCall()
} else {
defaultCall()
}
你甚至可以避免if-else条件(通过模式匹配),但这可能会降低代码的可读性。