我如何使用函数式编程范式来删除以下代码片段中的'var‘,我正在尝试将json字符串解析为mapString,Object,如果失败,我将其解析为mapLong,Object,所以'KEY_TYPE’只是一个开关,我如何在函数式编程中实现开关逻辑?
var KEY_TYPE = "String"
/**
* 解析json格式 先尝试一次解析成Map[String,Object] 失败则解析成Map[Long,Object]
*
* @param runSnap
* @return
*/
def parseJson(runSnap: String): Map[Long, Object] = {
Try {
if (KEY_TYPE == "String") {
JSONUtils.parseByFastJson(runSnap).asScala
.toMap.map(entry => entry._1.toLong -> entry._2)
} else {
JSONUtils.parseByFastJsonLongKey(runSnap).asScala
.toMap.map(entry => Long2long(entry._1.toLong) -> entry._2)
}
} match {
case Success(result) => result
case Failure(exception) => {
println("json parse excepiton " + exception)
if (KEY_TYPE == "String") {
KEY_TYPE = "Long"
parseJson(runSnap)
} else {
Map[Long, Object]()
}
}
}
}
发布于 2018-05-28 15:00:26
不是如下所示:
def parseJson(runSnap: String): Map[Long, Object] = {
Try(JSONUtils.parseByFastJson(runSnap).asScala .toMap.map(entry => entry._1.toLong -> entry._2))
.toOption
.orElse(Try(JSONUtils.parseByFastJsonLongKey(runSnap).asScala).toOption)
.getOrElse( Map[Long, Object]())
}
发布于 2018-05-28 19:07:12
以下是您的代码的一个功能更强的版本。它定义了一个带有apply
方法的对象,该方法可以像原始函数一样使用。
object parseJson {
private def parseAsString(runSnap: String): Map[Long, Object] =
Try {
JSONUtils.parseByFastJson(runSnap).asScala
.toMap.map(entry => entry._1.toLong -> entry._2)
} match {
case Success(result) =>
result
case _ =>
parser = parseAsLong _
parser(runSnap)
}
private def parseAsLong(runSnap: String): Map[Long, Object] =
Try {
JSONUtils. parseByFastJsonLongKey(runSnap).asScala
.toMap.map(entry => Long2long(entry._1.toLong) -> entry._2)
}.getOrElse(Map[Long, Object]())
private val parser = parseAsString _
def apply(runSnap: String) = parser(runSnap)
}
最初,parser
设置为parseAsString
,因此apply
调用parseAsString
,后者调用parseByFastJson
。但是当parseAsString
中的解析失败时,它会将parser
设置为parseAsLong
。随后对apply
的调用将调用parseAsLong
,后者将改为调用parseByFastJsonLongKey
。调用这两个JSON函数的唯一时间是第一次parseByFastJson
失败。在此之后,parseAsLong
将直接调用parseByFastJsonLongKey
。
使用对象可以隐藏var
,并且在var
中存储函数比每次测试String
更干净、更有效。
https://stackoverflow.com/questions/50560086
复制相似问题