case class student1(name :String, marks :Long)
case class student2(studentName:String, marks:Long)
val mylist:List[student1] = List( student1("a",100) , student1("b",200))
我怎么能轉換mylist
成List[student2]
在比這更優雅的方式?
val res: List[student2] = mylist.map(s => student2(s.name,s.marks))
uj5u.com熱心網友回復:
您可以添加一個輔助建構式。
case class student2(studentName:String, marks:Long) {
def this(s:student1) = this(s.name, s.marks)
}
. . .
val res: List[student2] = mylist.map(new student2(_))
或者你可以只做一個模式匹配,但為此你真的應該大寫你的類名。
val res: List[Student2] =
mylist.map{case Student1(n,m) => Student2(n,m)}
uj5u.com熱心網友回復:
首先,請classes
在CapitalCamelCase
. 所以Student1
和Student2
。
現在,如果你有兩個完全相同的case classes
例子,你可以在不使用任何庫的情況下輕松地在它們之間進行轉換。
val myList2: List[Student2] =
mylist.map(s => Student2.tupled(Student1.unapply(s).get))
這對于任何兩個將作業case classes
A
和B
這是在晶格結構相似。
uj5u.com熱心網友回復:
@sarveshseri的( @esse的)溶液似乎是Scala中2(斯卡拉3)最簡單的一種。以下使用庫的解決方案更難,但更靈活。
如果您只有這樣的轉變,我會堅持您的方法或@wvh建議的方法。
如果您有許多此類轉換,請考慮使用資料操作庫之一。
例如煙囪
import io.scalaland.chimney.dsl._
val res: List[student2] = mylist.map(
_.into[student2]
.withFieldRenamed(_.name, _.studentName)
.transform
)
或無形
import shapeless.{Generic, HList}
trait Convert[A, B] {
def apply(a: A): B
}
object Convert {
implicit def mkConvert[A <: Product, B <: Product, L <: HList](implicit
genericA: Generic.Aux[A, L],
genericB: Generic.Aux[B, L]
): Convert[A, B] = a => genericB.from(genericA.to(a))
}
implicit class ConvertOps[A](val a: A) extends AnyVal {
def to[B](implicit convert: Convert[A, B]): B = convert(a)
}
val res: List[student2] = mylist.map(_.to[student2])
也看看Monocle或Quicklens。
uj5u.com熱心網友回復:
如果您使用的是 Scala 3(又名 dotty),則以下代碼有效:
scala> import scala.deriving.Mirror
scala> mylist.map(summon[Mirror.Of[student2]].fromProduct)
val res1: List[student2] = List(student2(a,100), student2(b,200))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/318744.html
下一篇:返回列表