将future[option[string]]转换为future[string]

rggaifut  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(438)
def getRecordsFromDB(primaryKey: Long): Future[Seq[Record]] = ???

def extractAValueFromResult: Future[String] =
  getRecordsFromDB("abcxyz").map(_.headOption.map(_.fieldName).recover(????)

具有上述功能—第一个函数用于查询数据库并获取记录,第二个函数用于从第一个函数返回的记录中提取特定字段。
我应该如何修改 extractAValueFromResult 所以我明白了 Future[String] ,所以当记录为空或未来失败时,我可以返回空 String ? 仅供参考,只需记录extractavaluefromresult的返回值,因此不希望在将来失败时使整个应用程序失败。

hgb9j2n6

hgb9j2n61#

这就是你想要的:

getRecordsFromDB("abcxyz").map(_.head).map(_.fieldName).recover { case _ => "" }

有几点: _head 是“代码气味”(以同样的方式 Option.get 是),因为它将在集合为空时抛出。一个“纯粹主义者”会写 _.headOption.fold("")(_.fieldName) 相反。。。不过,既然你最终还是会康复的,我不太明白这有什么意义。
捕捉所有异常实际上也是“代码气味”。至少应该是这样 case NonFatal(_) => ... (我刚刚写道 _ 但即便如此,也很少有好主意:由于网络超时或数据库关闭而导致的故障与不存在的条目完全不同。默默地把所有的失败合并在一起,然后把它们和“找不到”的情况混为一谈只是。。。错了。如果您只是在玩东西,它会工作,但永远不要在任何生产代码中这样做。

46scxncf

46scxncf2#

你可以这样做:

def extractAValueFromResult: Future[String] = 
  getRecordsFromDB("abcxyz")
      .flatMap(seq => Future.fromTry(Try(seq.headOption.map(_.fieldName).get)))

相关问题