首页 > 解决方案 > 如何在scala中映射到CaseClass

问题描述

我开始 scala 我有这个示例案例类

case class OrderItem(title: String,price: Long,quantity:Int,cover:Option[String],detailJson: String)

我有 List[OrderItem] 和 List[replaceregex] 我想将字符串替换为 list[Orderitem] 并且我愿意

val s = OrderItem.flatMap(a => target.map (
      b =>
        if (a.detailJson.contains(start + "\"" + b.unit+ "\""))
          OrderItem(
            a.title,
            a.price,
            a.quantity,
            a.cover,
            a.detailJson.replaceFirst(startregex + b.unit, b.unitreplace))
        else None
      )).filter(_ != None)

这返回 List[Product]

我可以从地图中列出 [Orderitem] 吗?或者这个我的代码是不好的解决方案你能告诉我请我开始吗

标签: scalafunctional-programming

解决方案


这将返回 a List[Product],因为您的map操作返回 aOrderItem或 a None,而这 2 最接近的祖先类型是Product

您可能希望始终Option[OrderItem]在地图中返回一个,然后只保留定义的项目,这要归功于collect

val s = orderItem
  .flatMap(a =>
    target.map( b =>
      if (...)
        Some(OrderItem(...)))
      else
        None
    )
    .collect { case Some(o) => o }
  )

但是等等,作为Option扩展,Seq你实际上可以使用flatMap和删除collect这样的:

val s = orderItem
  .flatMap(a =>
    target.flatMap(b =>
      if (...)
        Some(OrderItem(...)))
      else
        None
    )
  )

推荐阅读