所以我需要在两个不同大小的数组中找到相同的 id 值,然后创建另一个数组,包括第一个数组中的 id、rdl 值和第二个数组中的 amount 值
这是我尝试过的,我知道它行不通,因为我在类(class)中使用了元素,但我不知道该怎么做
case class LenderTotalBalanceData(lenderId: String, direction: String, amount: BigDecimal)
case class LenderCashOutBody(lenderId: String, amount: BigDecimal, rdlAcc: String)
val sortedCashOutData = Seq(LenderCashOutData("9a268e12-c7fd-37dc-9875-a705296f707c","testRdlAcc"))
val sortedBalanceData = Seq(LenderTotalBalanceData("20268e12-c7fd-37dc-9875-a705296f707c","source", 0.0),LenderTotalBalanceData("9a268e12-c7fd-37dc-9875-a705296f707c","source", 0.0))
val seqOfDto = sortedCashOutData.zip(sortedBalanceData).map {
case (x, y) =>
if (x.lenderId == y.lenderId)
LenderCashOutBody(
x.lenderId,
y.amount,
x.rdl
)
}
因此,我想要 LenderCashOutBody("9a268e12-c7fd-37dc-9875-a705296f707c", 0.0, "testRdlAcc")
最佳答案
方法zip
通过索引连接序列,你需要在另一个数组中找到匹配id的值。
我想通过 id 匹配两个数组的最简单的解决方案是使用 find
:
case class LenderTotalBalanceData(lenderId: String, direction: String, amount: BigDecimal)
case class LenderCashOutBody(lenderId: String, amount: BigDecimal, rdlAcc: String)
case class LenderCashOutData(lenderId: String, rdl: String)
val sortedCashOutData = Seq(LenderCashOutData("9a268e12-c7fd-37dc-9875-a705296f707c","testRdlAcc"))
val sortedBalanceData = Seq(LenderTotalBalanceData("20268e12-c7fd-37dc-9875-a705296f707c","source", 0.0),LenderTotalBalanceData("9a268e12-c7fd-37dc-9875-a705296f707c","source", 0.0))
val seqOfDto = sortedCashOutData.flatMap {
case LenderCashOutData(lenderId, rdl) => sortedBalanceData
.find(_.lenderId == lenderId)
.map {
case LenderTotalBalanceData(_, _, amount) => {
LenderCashOutBody(
lenderId,
amount,
rdl
)
}
}
}
您也可以使用for-compressive
来编写它,这可以说更具可读性(但在找到第一个匹配值后它不会停止嵌套搜索):
val seqOfDto = for {
LenderCashOutData(lenderId, rdl) <- sortedCashOutData
LenderTotalBalanceData(tbLenderId, _, amount) <- sortedBalanceData if tbLenderId == lenderId
} yield LenderCashOutBody(
lenderId,
amount,
rdl
)
如果您的序列非常大,您可能应该考虑使用 Map
和 id 作为加速查找的关键。
关于scala - 如何在两个对象列表中找到相同的值scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57336643/