使用可选字段创建案例类的有效方法

时间:2017-08-17 03:41:22

标签: scala

我需要创建一个带有可选字段的案例类。我指的是Case Classes with optional fields in Scala

 case class Student(firstName: String, lastName: Option[String] = None)
 case class Student1(firstName: String,addd:String,lastName: Option[String] = None,surname:Option[String] = None)
  1. 初始化它的方法,除了使用Some("Bar")来初始化它之外,还有其他任何方式有效的方式,因为我有很多字段apporx到15。

     Student("Foo")
     Student("Foo", None)            // equal to the one above
     Student("Foo", Some("Bar")) 
    
  2. print(Student1("Foo","abc",None,Some("abc"))),我想要一个    替代无

  3. 如果我们遍历字段

         println(Student("Foo").productIterator.mkString("\n"))
    
  4. 打印

    Foo
    None
    

    我想删除无

2 个答案:

答案 0 :(得分:1)

对于1,2,我认为您可以使用名称和值来设置Option字段并跳过您不想设置的字段,例如:

Student1("firstname", "add", surname = Some("foo"))

对于3,我认为您可以使用过滤器来跳过None字段,例如:

s.productIterator.filter(_ match {
    case None => false
    case _ => true
  }).mkString(" ")

答案 1 :(得分:0)

1 - 重载apply()方法。

object Student{
  def apply(fn: String, ln: String) = new Student(fn, Option(ln))
}

Student("bob", "jones")  // res0: Student = Student(bob,Some(jones))
Student("ann")           // res1: Student = Student(ann,None)

2 - 无法完成。

3 - 覆盖toString方法。

case class Student(firstName: String, lastName: Option[String] = None) {
  override def toString:String = 
    "Student(" + firstName + lastName.fold("")(",".+) + ")"
}

Student("bob", "jones")  // res0: Student = Student(bob,jones)
Student("ann")           // res1: Student = Student(ann)