我试图从字符串字符串中提取值并从中创建(可选)案例类实例。如何从字符串中提取值以在Scala中创建案例类实例
该字符串采用的形式:
val text = "name=John&surname=Smith"
我有一个Person类将接受两个值:
case class Person(name: String, surname: String)
我有一些代码,执行转换:
def findKeyValue(values: Array[String])(prefix: String): Option[String] =
values.find(_.startsWith(prefix)).map(_.substring(prefix.length))
val fields: Array[String] = text.split("&")
val personOp = for {
name <- findKeyValue(fields)("name=")
surname <- findKeyValue(fields)("surname=")
} yield Person(name, surname)
虽然这产生的答案,我需要我想知道:
- 有没有更有效的方法来做到这一点?
- 是否有一个更功能的编程为中心的方式来做到这一点?
一些制约因素:
在文中姓名字段的顺序可以改变。下面的内容也是有效的:
val text = "surname=Smith&name=John"
有可能是需要被忽略其他领域:
val text = "surname=Smith&name=John&age=25"
解决方案需要满足时提供的文本格式不正确或有没有的必填字段。
该解决方案无法使用反射或宏。
如果上下文是HTTP查询参数解析,如阿尔瓦罗·卡拉斯科提到的,你最好还是重用HTTP库方法或者如果您不能,则必须考虑参数和字符集的URL编码。如果它处于不同的背景下,榆木的回答非常简洁。而且我不会担心效率,除非字符串有巨大的潜力,而且它被认为是一个瓶颈。 –