2016-07-20 13 views
-1

Ich habe eine Liste von Eigenschaften, die in verschiedene Kategorien setzen können. Der Werttyp ist unterschiedlich. Verschiedene Kategorien können jedoch denselben Werttyp haben.Gibt es eine elegante Art und Weise zu sammeln und konvertieren Sie den Typ zur gleichen Zeit in Scala

val data: List[(String, Any)] = List("first name" -> "rockie", 
            "last name" -> "yang", 
            "address" -> "rather not reveal", 
            "wanted age" -> 23) 

val publicProps = Set("first name", "last name") 
val privateProps = Set("address", "wanted age") 

val filtered = data.filter(d => publicProps.contains(d._1)) 

// but the type of filtered is List[(String, Any)] 

// I could do a map to convert the type to List[(String, String)] 
filtered.map{case (name, value: String) => name -> value} 

// If the number of publicProps is small 
// I could do collect and convert at the same type 
data.collect { 
    case ("first name", value: String) => 
     ("first name", value) 
    case ("last name", value: String) => 
     ("last name", value) 
} 

Gibt es eine elegante Möglichkeit, sammeln und konvertieren Sie den Typ auf den gleichen Typ?

Antwort

2

Ich denke, es hängt davon ab, was Sie elegant finden. Und wie sicher Sie sind, dass alle Werte eines publicProp Strings sind.

data.collect { 
    case (key, value: String) if publicProps.contains(key) => (key, value) 
} 
+0

Vielen Dank. Da ich mir sicher bin, dass es eine Saite ist, muss ich die Zeit zur gleichen Zeit umrechnen. –

2

Wie wäre es

data.collect { 
    case (k, v: String) if publicProps.contains(k) => (k, v) 
} 
+0

Sie brauchen nicht "enthält". '.. wenn publicProps (k) => ...' wäre noch "eleganter";) – Dima

+0

@Dima richtig, das wäre kürzer. Ich finde immer noch "enthält" besser lesbar :) –

+0

Danke. Ich fühle auch, dass die Verwendung von Inhalten lesbarer ist. –