代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

筛选scala中定义的选项字段

  •  0
  • JohnBigs  · 技术社区  · 6 年前

    我有一个带选项的案例类:

    case class PersonUpdate(name: Option[String], age: Option[Int], country: Option[String])
    

    我需要检查定义了哪些值,并生成一个带有名称和值的映射,例如:

    如果我有这个物体:

    val perUpdate = PersonUpdate(Option("john"), None, Option("England"))
    

    比地图看起来更像:

    val result = Map("people.$.name" -> "john", "people.$.country" -> "England")
    

    最好的方法是什么?有效的斯卡拉方法?

    2 回复  |  直到 6 年前
        1
  •  -1
  •   Tim    6 年前

    List(
      perUpdate.name.map("people.$.name" -> _),
      perUpdate.age.map("people.$.age" -> _.toString),
      perUpdate.country.map("people.$.country" -> _)
    ).flatten.toMap
    

    perUpdate.getClass.getDeclaredFields.flatMap { f =>
      f.setAccessible(true)
    
      f.get(perUpdate).asInstanceOf[Option[Any]].map("people.$."+f.getName -> _.toString)
    }.toMap
    

    val fieldNames = List("name", "age", "country")
    
    fieldNames.flatMap{ fieldName =>
      val fieldValue = perUpdate.getClass.getDeclaredField(fieldName)
      fieldValue.setAccessible(true)
    
      fieldValue.get(perUpdate).asInstanceOf[Option[Any]].map("people.$."+fieldName -> _.toString)
    }.toMap
    
        2
  •  -1
  •   Dima    6 年前

    Product

    Seq("name", "age", "country")
      .map { "people.$." + _ }
      .iterator
      .zip(perUpdate.productIterator)
      .collect { case (k, Some(v)) => k -> v }
      .toMap