【问题标题】:How to find same values in two Lists of objetcs scala如何在两个对象列表中找到相同的值scala
【发布时间】:2019-12-11 16:21:27
【问题描述】:

所以我需要在两个不同大小的数组中找到相同的 id 值,然后创建另一个数组,包括第一个数组中的 id、rdl 值和第二个数组中的数量值

这是我尝试过的,我知道它不起作用,因为我在课程中学习元素,我不知道该怎么做

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")

【问题讨论】:

    标签: scala scala-collections


    【解决方案1】:

    方法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-comprehension 来编写它,这可以说更具可读性(但它不会在找到第一个匹配值后停止嵌套搜索):

    val seqOfDto = for {
      LenderCashOutData(lenderId, rdl) <- sortedCashOutData
      LenderTotalBalanceData(tbLenderId, _, amount) <- sortedBalanceData if tbLenderId == lenderId
    } yield LenderCashOutBody(
      lenderId,
      amount,
      rdl
    )
    

    如果您的序列非常大,也许您应该考虑使用带有 idMap 作为加快查找速度的关键。

    【讨论】:

      【解决方案2】:

      这是使用flatMapcollect 的替代方法:

      val seqOfDto = sortedCashOutData.flatMap{ case LenderCashOutData(lenderId, rdl) =>
        sortedBalanceData.collect{
          case LenderTotalBalanceData(id, _, amt) if id == lenderId =>
            LenderCashOutBody(id, amt, rdl)
        }
      }
      

      如果只需要第一个匹配项或者lenderIdsortedBalanceData 中是唯一的,请考虑将collect 替换为collectFirst

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-27
        • 2019-02-03
        • 2021-05-27
        • 2023-02-07
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        相关资源
        最近更新 更多