我想创建案例类的字符串表示
case class Person(s:Student)
case class Student(name:String,value:String){
def toMyString(flag:Boolean):String= if(flag)s"${name} =${value}" else s"Hello${name}+${value}"
}
Person(Student("abc","def")).productIterator
我想从toMyString
致电productIterator
。
我的实际用例在案例类中有很多元素。
答案 0 :(得分:3)
只要询问每个迭代器元素是否为目标类型。
Person(Student("abc","def")).productIterator.collect{
case x:Student => x.toMyString(true)
}
// res0: Iterator[String] = non-empty iterator (String: "abc=def")
答案 1 :(得分:1)
有两种解决方案可以为元素生成String
:
1.为需要实现trait
的{{1}}创建elements
,并且需要生成字符串的元素从中扩展,并实现它,如:
toMyString
2。通过方法名称获取 trait MyString {
def toMyString(flag: Boolean): String
}
case class Student(name: String, value: String) extends MyString{
def toMyString(flag: Boolean): String = if (flag) s"${name} =${value}" else s"Hello${name}+${value}"
}
val result: List[String] = Person(Student("abc","def")).productIterator.collect{
case x: MyString => x.toMyString(true)
}
方法,使用reflection
,这是一种棘手的方式而不是类型安全,应该考虑更多,例如:
toMyString
答案 2 :(得分:1)
我们需要Iterator[Student]
而不是Iterator[Any]
Person(Student("abc","def")).productIterator.asInstanceOf[Iterator[Student]]