List 在对象列表中,如何将一个对象的字段与Scala中相同列表中另一个对象的相同字段相减?

List 在对象列表中,如何将一个对象的字段与Scala中相同列表中另一个对象的相同字段相减?,list,scala,object,List,Scala,Object,我有以下案例课程: case class AgeDiff(serviceLocation: ServiceLocation, daysBehind: Option[Long]) case class ServiceLocation( environment: String, service: String, pool: String, region: String ) 我有一个列表[AgeDiff] 此列表中只有两种可能的环境用于serviceLocation

我有以下案例课程:

case class AgeDiff(serviceLocation: ServiceLocation, daysBehind: Option[Long])
case class ServiceLocation(
    environment: String,
    service: String,
    pool: String,
    region: String
)

我有一个
列表[AgeDiff]

此列表中只有两种可能的环境用于
serviceLocation

QA
Prod

清单的一个例子可以是:

val ageDiffList = List(
    AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    ),AgeDiff(
      ServiceLocation("qa", "b-service", "poolC", "us-west-4"),
      Some(8)
    ),
    AgeDiff(
      ServiceLocation("prod", "b-service", "poolC", "us-west-4"),
      Some(10)
    )
)
我想返回一个新的
列表[AgeDiff]
,从
qa

例如,当列表减法发生时,它将如下所示:

val ageDiffList = List(
    AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(1)

    ),AgeDiff(
      ServiceLocation("qa", "b-service", "poolC", "us-west-4"),
      Some(8)
    ),
    AgeDiff(
      ServiceLocation("prod", "b-service", "poolC", "us-west-4"),
      Some(2)
    )
)


条件是:
  • 我想对同一个
    池的年龄差异进行减法,
    
    地区
    服务
例如:

   AgeDiff(
      ServiceLocation("qa", "a-service", "poolC", "us-west-4"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    )
不是

  • 如果同一服务中的天数不同, 减法
例如:

   AgeDiff(
      ServiceLocation("qa", "a-service", "poolb", "us-west-3"),
      Some(6)
    ),
    AgeDiff(
      ServiceLocation("prod", "a-service", "poolC", "us-west-4"),
      Some(7)
    )
除非他们有相同的池、区域和服务,或者他们落后比赛几天,否则他们可能会崩溃。但是,服务名称必须相同才能减去

  • 如果
    daysBehind
    None
    ,则不要进行比较,保持原样

    • 好的,规格还是有点模糊,但我会试试看

      val newADList =
        ageDiffList.foldLeft((List[AgeDiff](),Map[ServiceLocation,Long]())){
          case ((acc, mp)
               ,ad@AgeDiff(sl@ServiceLocation("qa",_,_,_),less)) =>
            (ad::acc, mp+(sl.copy(environment="prod") -> less.getOrElse(0L)))
          case ((acc, mp)
               ,ad@AgeDiff(sl@ServiceLocation("prod",_,_,_),Some(x))) =>
            (ad.copy(daysBehind = Some(x - mp.getOrElse(sl,0L)))::acc, mp)
          case ((acc, mp), ad) => (ad::acc, mp)
        }._1.reverse
      

      这假设
      daysBehind
      值为
      None
      “qa”
      未被忽略,而是有效地关闭所有后续
      “prod”中的减法运算
      元素具有匹配的
      服务位置
      值。

      因此,如果列表只有
      环境
      “qa”
      ,或者如果列表具有所有唯一的
      服务
      值,则不会有任何更改。正确吗?是的,正确。如果列表以一个
      “qa”
      条目开始,然后是7个匹配的
      “prod”
      条目,减法会发生一次吗(第一个
      “prod”
      )或7次?7次,因为区域可能不同,并且它们也可能包含不同的
      daysBehind
      值。如果
      daysBehind
      中没有
      s,该怎么办?
      
      val newADList =
        ageDiffList.foldLeft((List[AgeDiff](),Map[ServiceLocation,Long]())){
          case ((acc, mp)
               ,ad@AgeDiff(sl@ServiceLocation("qa",_,_,_),less)) =>
            (ad::acc, mp+(sl.copy(environment="prod") -> less.getOrElse(0L)))
          case ((acc, mp)
               ,ad@AgeDiff(sl@ServiceLocation("prod",_,_,_),Some(x))) =>
            (ad.copy(daysBehind = Some(x - mp.getOrElse(sl,0L)))::acc, mp)
          case ((acc, mp), ad) => (ad::acc, mp)
        }._1.reverse