【发布时间】:2018-06-02 22:27:02
【问题描述】:
我编写了一个方法,通过执行 API 调用并添加丰富的数据来丰富个人数据。
我有这个案例类:
case class Person(personData: PersonData, dataEnrichment: Option[DataEnrichment])
我的方法应该返回这个案例类,但我之前有几个过滤器,如果人的高度不是"1.8 m" 或者如果使用正则表达式在生物中找不到 personId,我想返回Person dataEnrichment = None 。我的问题是 person height 和 personId 本身就是 Options,所以看起来像这样:
def enrichPersonObjWithApiCall(person: Person) = {
person.personData.height.map(_.equals("1.8 m")) match {
case Some(true) =>
val personId = person.personData.bio flatMap { comment =>
extractPersonIdIfExists(comment)
}
personId match {
case Some(perId) =>
apiCall(perId) map { apiRes =>
Person(
person.personData,
dataEnrichment = apiRes)
}
case _ =>
Future successful Person(
person.personData,
dataEnrichment = None)
}
case _ =>
Future successful Person(
person.personData,
dataEnrichment = None)
}
}
def extractPersonIdIfExists(personBio: String): Option[String] = {
val personIdRegex: Regex = """(?<=PersonId:)[^;]+""".r
personIdRegex.findFirstIn(personBio)
}
def apiCall(personId: String): Future[Option[DataEnrichment]] = {
???
}
case class DataEnrichment(res: Option[String])
case class PersonData(name: String, height: Option[String], bio: Option[String])
这样执行它似乎不是 Scala 的最佳实践。您有更优雅的方法来获得相同的结果吗?
【问题讨论】:
标签: scala scala-option