2017-08-17 2 views
1

ich eine Fall-Klasse mit optionalen Feldern erstellen müssen erstellen .i zu Case Classes with optional fields in Scalaeffiziente Art und Weise Fall-Klasse mit optionalen Feldern

refered
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. Die Art und Weise, es zu intialize, Gibt es eine andere Art und Weise effizient abgesehen von der Verwendung von Some("Bar"), um es zu initialisieren, da ich viele Felder apporx bis 15 habe.

    Student("Foo") 
    Student("Foo", None)   // equal to the one above 
    Student("Foo", Some("Bar")) 
    
  2. print(Student1("Foo","abc",None,Some("abc"))), möchte ich

  3. eine Alternative zu Keiner haben, wenn wir durch die Felder iterieren

     println(Student("Foo").productIterator.mkString("\n")) 
    

Er druckt

Foo 
None 

Ich möchte entfernen Keine

+1

ich denke, es hängt davon ab, was Sie unter 'efficient' – mfirry

Antwort

0

1 - Überladen Sie die apply() Methode.

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 - Kann nicht gemacht werden.

3 - Übersteuern Sie die Methode .

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

in overloadin g apply method .... meine Anzahl von Feldern ist zu viel ... es gibt zu viele Argumente für Konstruktor – coder25

1

Für die 1, 2, ich glaube, Sie Namen mit Wert verwenden können das Option Feld zu setzen und die Felder überspringen, die Sie nicht wollen, setzen, wie:

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

3, ich glaube, Sie Filter verwenden können None Feld zu überspringen, wie:

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