gpt4 book ai didi

java - 如何从 scala 案例类生成 java 数组

转载 作者:行者123 更新时间:2023-11-30 08:16:06 26 4
gpt4 key购买 nike

我正在编写一个小型数据访问库来帮助我在 Scala 程序中使用 Cassandra 准备好的语句(它不是开源的,但也许有一天)。我想做的是为案例类中的绑定(bind)语句自动生成一个 Java 数组

com.datastax.driver.core
PreparedStatement...
public BoundStatement bind(Object... values);

所以目前我有

case class Entity(foo:String, optionalBar:Option[String]) 

object Entity {
def toJArray(e:Entity) = { Array(e.foo, e.optionalBar.getOrElse(null)) }
}

val e1 = Entity("fred", Option("bill"))
val e2 = Entity("fred", None)

Entity.toJArray(e1)
res5: Array[String] = Array(fred, bill)
Entity.toJArray(e2)
res6: Array[String] = Array(fred, null)

toJArray 返回一个数组,我可以在绑定(bind)语句中使用它。如果有日期或 double 或 java 枚举,样板代码会变得更糟

new java.util.Date(createdOn)
scala.Double.box(price)
priceType.name

假设绑定(bind)参数与案例类字段的顺序相同,是否有一种方法可以在 Scala 中自动生成数组?

编辑感谢@srgfed01这是我想出的(不完整)但允许我做类似的事情

val customer1 = Customer( "email", "name", None, Option(new Date), OrdStatus.New)
session.execute(populate(customer1, insert))
val customer2 = Customer( "email2", "name2", Option(22), Option(new Date), OrdStatus.Rejected)
session.execute(populate(customer2, insert))

使用这个函数

def populate(state:Product, statement:PreparedStatement): BoundStatement = {
def set(bnd:BoundStatement, i:Int, aval:Any): Unit = {
aval match {
case v:Date => bnd.setDate(i, v)
case v:Int => bnd.setInt(i, v)
case v:Long => bnd.setLong(i, v)
case v:Double => bnd.setDouble(i, v)
case v:String => bnd.setString(i, v)
case null => bnd.setToNull(i)
case _ => bnd.setString(i, aval.toString)
}
}

val bnd = statement.bind
for(i <- 0 until state.productArity) {
state.productElement(i) match {
case op: Option[_] => set(bnd, i, op.getOrElse(null))
case v => set(bnd, i, v)
}
}
bnd
}

最佳答案

您可以使用 productIterator 调用您的 case 类对象:

case class Entity(foo: String, optionalBar: Option[String])

val e1 = Entity("fred", Option("bill"))
val e2 = Entity("fred", None)

def run(e: Entity): Array[Any] = e.productIterator
.map {
case op: Option[_] => op.getOrElse(null)
case v => v
}
.toArray

println(run(e1).mkString(" ")) // fred bill
println(run(e2).mkString(" ")) // fred null

关于java - 如何从 scala 案例类生成 java 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28506805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com