case类产品迭代器来创建字符串

时间:2017-08-22 16:27:00

标签: scala case-class

我想创建案例类的字符串表示

 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

我的实际用例在案例类中有很多元素。

3 个答案:

答案 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]]