Заменить значение атрибута на основе условий в Scala - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над модулем API в Scala, который запрашивает базу данных и возвращает извлеченные данные в формате 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-else и pattern-matching, но не могу правильно заменить, так как тип Option[String]. Вот как я пытался: (1) * * 1016

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 Ответ

2 голосов
/ 14 мая 2019

Примерно так должно работать:

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 в ot для типа ОС и ov для версии ОС. Если любой из Option s равен None, он вернет None и также вернет None, если тип ОС не «windows». Если все эти тесты пройдены, выражение yield вычисляет новую версию на основе этих значений. В этом случае for вернет Some(x), где x - значение выражения yield.

Выражение 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
  }
...