scala - 如何在两个对象列表中找到相同的值scala

标签 scala scala-collections

所以我需要在两个不同大小的数组中找到相同的 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
)

如果您的序列非常大,您可能应该考虑使用 Mapid 作为加速查找的关键。

关于scala - 如何在两个对象列表中找到相同的值scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57336643/

相关文章:

scala - 如何从发布中删除工件

java - 使用WindowBuilder + Scala,有什么好的想法吗?

scala - 使用 akka-persistence : growing state as list? 的事件溯源

java - 并行执行竞争计算并丢弃除第一个完成的计算之外的所有计算

Scala 通用函数

list - 将 Scala 列表的每个元素与列表中的其余元素进行比较

scala - 如何连接作为 map 值的列表?

scala.Some 无法转换为 scala.collection.immutable.Map 异常

scala - 为什么用模式匹配收集不能缩小特定类别?

scala - 无法基于 ...Inclusive[Long] 类型的集合构造具有 Long 类型元素的 ...Inclusive[Long] 类型集合