gpt4 book ai didi

scala - 使用 Scala 中的选项(最佳实践)

转载 作者:行者123 更新时间:2023-12-04 21:31:14 26 4
gpt4 key购买 nike

我编写了一个方法,通过执行 API 调用并添加丰富的数据来丰富个人数据。
我有这个案例类:

case class Person(personData: PersonData, dataEnrichment: Option[DataEnrichment])
我的方法应该返回这个案例类,但我之前几乎没有过滤器,以防人的高度不是 "1.8 m"或者,如果使用正则表达式在 bio 中找不到 personId,我想返回 PersondataEnrichment = None .我的问题是 person height 和 personId 本身就是选项,所以它看起来像这样:
   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 的最佳实践。你有更优雅的方法来获得相同的结果吗?

最佳答案

使用 for是处理 Option 链的好方法值(value)观:

def enrichPersonObjWithApiCall(person: Person): Future[Person] =       
(
for {
height <- person.personData.height if height == "1.8 m"
comment <- person.personData.bio
perId <- extractPersonIdIfExists(comment)
} yield {
apiCall(perId).map(Person(person.personData, _))
}
).getOrElse(Future.successful(Person(person.personData, None)))

这相当于一个 map 的链, flatMapfilter调用,但更容易阅读。

关于scala - 使用 Scala 中的选项(最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50661683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com