【发布时间】:2016-02-28 05:20:19
【问题描述】:
我正在尝试从标记化的字符串中提取值并从中创建一个(可选的)案例类实例。
字符串采用以下形式:
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 查询参数解析,正如 Alvaro Carrasco 提到的,你最好重用一个 HTTP 库方法,或者如果你不能,你必须对参数和字符集进行 URL 编码考虑到。如果它在不同的上下文中,榆树的答案非常简洁。而且我不会担心效率,除非字符串有可能很大并且被测量为瓶颈。
标签: scala functional-programming