【发布时间】:2021-09-21 08:50:59
【问题描述】:
我是 Scala 的新手,尝试使用一些求和逻辑从列表转换为映射,如下所示。
case class ProductProperty(name:String, value:Option[String]= None, options:List[OptionItem]=List())
case class OptionItem(title:Option[String], description:Option[String] = None , price:Int)
val properties = List(ProductProperty(name = "size", value = Some("val1") , options = Some(List(OptionItem(price = 10) , OptionItem(price = 204))),
ProductProperty(name = "size", value = Some("val2") , options = Some(List(OptionItem(price = 122) , OptionItem(price = 240))),
ProductProperty(name = "color", value = Some("val3") , options = Some(List(OptionItem(price = 101) , OptionItem(price = 204))),
ProductProperty(name = "color", value = Some("val13") , options = Some(List(OptionItem(price = 102) , OptionItem(price = 120))),
ProductProperty(name = "Quantity", value = Some("ssval3") , options = Some(List(OptionItem(price = 1011) , OptionItem(price = 204))),
ProductProperty(name = "Quantity", value = Some("ssval13") , options = Some(List(OptionItem(price = 1102) , OptionItem(price = 1210))
)
我需要将其展平并根据其名称和计算价格创建新地图。
Map {
"size" -> total price,
"color" -> total price,
"Quantity" -> total price
}
到目前为止我已经尝试过:
val optList = properties.map( list =>
list.map(op => op.options
.flatMap(i => List(ProductProperty(name = op.name, value = Some(i.value)))))
.flatten
)
val totalPrice = price.add(optList.map(list =>
list.map(_.options)
.flatten.map(_.price.getOrElse(0)).sum)
.getOrElse(0))
Map((optList.map(_.name).getOrElse(List())) -> totalPrice)
但这是不正确的。
【问题讨论】: