我一直在与 Scala 中解析 JSON 字符串的函数式方法的概念作斗争,并且在返回 Option(something) 的情况下碰壁了。我提出了这个问题 https://stackoverflow.com/questions/9289647/avoiding-some-headache有用的答案源源不断地涌来。
问题是,作为 Scala 的新手,正确的方法是什么?
目前我正在这样做:
import util.parsing.json.JSON._
object JsonSoap {
def main(args: Array[String]) {
val x = parseFull("""{"name":"Joe","surname":"SOAP"}""")
val y = x collect {
case m: Map[_, _] => m collect {
case (key: String, value: String) => key -> value
}
}
val z = for (m <- y; name <- m.get("name"); surname <- m.get("surname"))
yield {
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Person>
<Name>{name}</Name>
<Surname>{surname}</Surname>
</Person>
</soap:Body>
</soap:Envelope>
}
println(z)
}
}
我仍然坚持 Some()
有解决我的问题的好模式吗?当然,这必须是一个经过充分探索的领域。我该如何改进我的代码?
你并没有被“困住”Some
- 你有优势你有一个Some
!在 Java 中,您可能会遇到一个值,该值的类型无法表达它实际上可能不存在的事实!
MyThing recklessly = apiCall.getMeAThing();
recklessly.iSureHopeImNotNull(); //OH NOES!
与这个比较
apiCall.getMeAThing foreach (_.cannotPossiblyBeNull)
The Option
数据类型意味着查询的“可能不存在”位实际上已融入查询的返回类型中。请坚持Option
- 几周后,当您去编写 Java 代码时,您会发现它不在那里!
驳回你的反对意见
你可能会说:
噢,但我需要将已有的值加 1
I say:
apiCall.getMeAThing map (_ + 1)
你可能会说
噢,但我需要将它传递给一个方法,如果我有 null,则默认为空字符串
I say:
foo( apiCall.getMeAThing getOrElse "" )
你可能会说
哦,但我使用该值来调用另一个 API 方法并获取其他内容
I say:
apiCall.getMeAThing flatMap apiCall.getMeAnotherThing
你肯定会说
哦,但是对于所有这些对象创建来说,效率非常低
我说:“试试吧,就好了”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)