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