gpt4 book ai didi

scala - 如何在功能上处理日志记录的副作用

转载 作者:行者123 更新时间:2023-12-04 00:54:50 25 4
gpt4 key购买 nike

我想在记录没有相邻记录的情况下登录。有没有纯粹的功能性方法来做到这一点?一种将副作用与数据转换分开的方法?

这是我需要做的一个例子:

val records: Seq[Record] = Seq(record1, record2, ...)

val accountsMap: Map[Long, Account] = Map(record1.id -> account1, ...)

def withAccount(accountsMap: Map[Long, Account])(r: Record): (Record, Option[Account]) = {
(r, accountsMap.get(r.id))
}

def handleNoAccounts(tuple: (Record, Option[Account]) = {
val (r, a) = tuple
if (a.isEmpty) logger.error(s"no account for ${record.id}")
tuple
}

def toRichAccount(tuple: (Record, Option[Account]) = {
val (r, a) = tuple
a.map(acct => RichAccount(r, acct))
}

records
.map(withAccount(accountsMap))
.map(handleNoAccounts) // if no account is found, log
.flatMap(toRichAccount)

因此,我认为这种方法存在多个问题,使其不尽如人意。

元组返回类型很笨拙。我必须在后两个函数中解构元组。

日志记录函数必须处理日志记录,然后返回没有变化的元组。尽管没有发生任何转换,但将其传递给 .map 感觉很奇怪——也许有更好的方法来获得这种副作用。

是否有有效的方法来清理它?

最佳答案

我可能错了(我经常错),但我认为这可以满足所有要求。

records
.flatMap(r =>
accountsMap.get(r.id).fold{
logger.error(s"no account for ${r.id}")
Option.empty[RichAccount]
}{a => Some(RichAccount(r,a))})

关于scala - 如何在功能上处理日志记录的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408002/

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