2017-08-17 18 views
1

我需要創建可選字段的情況下。我類到refered 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")) 
    

它打印

Foo 
None 
迭代210

我想刪除無

+1

我認爲這取決於你的意思是什麼overloadin'efficient' – mfirry

回答

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) 
+0

g申請方法....我的字段數太多...它給構造函數提供了太多的參數 – coder25

1

對於1,2,我認爲你可以使用名稱與價值設置Option領域,跳過你不想設定的領域,如:

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

3,我認爲你可以使用過濾器來跳過None領域,如:

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