首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何使用函数式编程思想重构它?

我如何使用函数式编程思想重构它?
EN

Stack Overflow用户
提问于 2018-05-28 14:07:28
回答 2查看 105关注 0票数 0

我如何使用函数式编程范式来删除以下代码片段中的'var‘,我正在尝试将json字符串解析为mapString,Object,如果失败,我将其解析为mapLong,Object,所以'KEY_TYPE’只是一个开关,我如何在函数式编程中实现开关逻辑?

代码语言:javascript
复制
   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]()
        }
      }
    }
  }
EN

回答 2

Stack Overflow用户

发布于 2018-05-28 15:00:26

不是如下所示:

代码语言:javascript
复制
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]())
}
票数 0
EN

Stack Overflow用户

发布于 2018-05-28 19:07:12

以下是您的代码的一个功能更强的版本。它定义了一个带有apply方法的对象,该方法可以像原始函数一样使用。

代码语言:javascript
复制
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更干净、更有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50560086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档