根据Scala中的条件替换属性的值

时间:2019-05-14 12:36:43

标签: scala pattern-matching conditional

我正在使用scala中的API模块,该模块查询数据库并以JSON格式返回获取的数据作为响应。 对于JSON(类型为Option[String])中的特定属性,我需要根据某些条件来更改从数据库中获取的值。 目前,我的JSON响应如下:

.....
{
    "id": "1",
    "name": "abc",
    "osType": "windows",        
    "osVersion": "10.0.14393"        
},
{
    "id": "2",
    "name": "xyz",
    "osType": "ubuntu",        
    "osVersion": "18.04"
},
{
    "id": "3",
    "name": "pqr",
    "osType": "windows",        
    "osVersion": "6.1.7601"
},
......

对于osVersion,我需要将以下值替换为"osType": "windows"

if osVersion = 10.0.14393 , then Windows Server 2016
if osVersion starts with 6.1 , then Windows Server 2008 R2  

因此所需的输出如下所示:

.....
{
    "id": "1",
    "name": "abc",
    "osType": "windows",        
    "osVersion": "Windows Server 2016"        
},
{
    "id": "2",
    "name": "xyz",
    "osType": "ubuntu",        
    "osVersion": "18.04"
},
{
    "id": "3",
    "name": "pqr",
    "osType": "windows",        
    "osVersion": "Windows Server 2008 R2"
},
......

我尝试使用if-elsepattern-matching,但是由于类型为Option[String],因此无法正确替代。 这是我尝试的方法: (1)

def translateOSVersion (osType :Option[String] ,osVersion : Option[String]):Option[String] ={
          if (osType == "windows"){
            val version = if (osVersion =="10.0.14393")
              {
                Some("Windows Server 2016")
              }
            else {osVersion}
            version
            }
        }

        val oSVersion = translateOSVersion(ostr("osType") ,ostr("osVersion") )

        <modelJSON>(id, name, ostr("osType"), oSVersion)

(2)

 def translateOSVersion (osType :Option[String] ,osVersion : Option[String]) ={
  if (osType == "windows"){
    val version = if (osVersion =="10.0.14393") Some("Windows Server 2016")
    else osVersion
    }
}

val oSVersion = Some(translateOSVersion(ostr("osType") ,ostr("osVersion") ).toString)
  <modelJSON>(id, name, ostr("osType"), oSVersion)

(3)

def translateOSVersion (osType :Option[String] ,osVersion : Option[String]) ={
      if (osType == "windows"){
        osVersion match {
          case Some("10.0.14393") => "Windows Server 2016"
          case x =>x
        }
        }
    }
val oSVersion = Some(translateOSVersion(ostr("osType") ,ostr("osVersion") ).toString)
      <modelJSON>(id, name, ostr("osType"), oSVersion)

所有方法均未获得理想的结果。 请在这里帮助。

1 个答案:

答案 0 :(得分:2)

类似的事情应该起作用:

def translateOSVersion(osType: Option[String], osVersion: Option[String]): Option[String] =
  (for {
    ot <- osType if ot == "windows"
    ov <- osVersion
  } yield {
    if (ov == "10.0.14393") {
      "Windows Server 2016"
    } else if (ov.startsWith("6.1")) {
      "Windows Server 2008 R2"
    } else {
      ov
    }
  }) orElse osVersion

它是这样工作的:

for语句创建一个代表更新的版本号的新Option[String],如果没有更改,则创建None。通过将两个Option值分别提取到OS类型的ot和OS版本的ov中来工作。如果Option中的任何一个为None,它将返回None,并且如果OS类型不是“ windows”,它将返回None。如果所有这些测试均通过,则yield表达式将根据这些值来计算新版本。在这种情况下,for将返回Some(x),其中xyield表达式的值。

如果orElse表达式为Some(x),它将返回第一个值,否则它将返回第二个值。因此,如果for的结果为Some(x),则将其作为函数的结果返回。如果for返回None,则返回原始值作为结果。


这是一个比较平淡的版本,虽然不太有趣,但可能更合适!

def translateOSVersion(osType: Option[String], osVersion: Option[String]): Option[String] =
  if (osType.contains("windows")) {
    if (osVersion.contains("10.0.14393")) {
      Some("Windows Server 2016")
    } else if (osVersion.exists(_.startsWith("6.1"))) {
      Some("Windows Server 2008 R2")
    } else {
      osVersion
    }
  } else {
    osVersion
  }
相关问题