scala - 我如何使用函数式编程思想重构它
问题描述
如何使用函数式编程范式删除以下代码片段中的“var”,我试图将 json 字符串解析为 map[String,Object],如果失败,我将其解析为 map[Long,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]()
}
}
}
}
解决方案
是不是像下面这样:
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]())
}
推荐阅读
- c++ - 类没有友元方法的成员
- ios - Flutter Firestore 读写响应在 Ios 中非常慢
- javascript - Map.foreach 中的渲染组件
- java - 我想从一个 API 响应体中获取价值,并使用 Cucumber gherkin 将其用于另一个 api 请求
- jquery - 如何验证重复的表格?
- ios - 如何解决颤振中的“allowsBackgroundLocationUpdates”错误
- c# - 使用 Blazorise DataGrid 在移动设备上隐藏一些列
- ruby-on-rails - 资产管道中不存在资产“rails_admin/rails_admin.css”。):
- python - 使用自定义命令在 pysftp/Paramiko 中启动 SFTP 服务器
- javascript - 在 Photoshop 中使用脚本替换图层中的图像