2017-05-30 3 views
0

ich eine Methode wie folgt:Dynamisches Element hinzufügen, nachdem Muster zur Karte passenden

protected def extract(implicit params:Params) = 
    Map(
    "address" -> params.address, 
    "city" -> params.address, 
    "region" -> params.region, 
)collect { 
    case (k, v) if v.isDefined => k -> v.get 
    } 

I-Wert von Stadt ersetzen wollen, so dass:

"city" -> if(params.city.contains("York")) "NewYork" else params.city, 

Wie kann ich dies in scala erreichen?

+0

aktualisierte Abfrage auf dieser (Lösung zur Verfügung gestellt werden, indem Stephen arbeitete btw) Wie mache ich diesen Fall unempfindlich, dh ich muss sowohl mit "York" als auch mit "york" umgehen ". Irgendwelche Gedanken? – b1399877

Antwort

1

Man konnte es in Spiel setzen

def extract(implicit params:Params) = 
    Map(
    "address" -> params.address, 
    "city" -> (if(params.city.contains("York")) Some("NewYork") else params.city), 
    "region" -> params.region 
) collect { 
    case (k, v) if v.isDefined => k -> v.get 
    } 

Ich bin sicher, es gibt viele andere Wege, es zu tun. Nicht sicher, was du wirklich willst.

+0

Mit dieser Lösung bekomme ich Fehler wie: "Kann Symbolparametern nicht auflösen" – b1399877

+0

sorry von bad. Das habe ich behoben. Es brauchte zusätzliche Elternteile. Auch ist es nicht klar, was eine Option ist und was nicht, – Stephen

+0

danke Stephen .Es funktionierte :) – b1399877

1

Stephens Ansatz der Erstellung der Karte mit dem richtigen Wert ist wahrscheinlich am besten. Wenn Sie eine allgemeine Zuordnung von String zu Option [String] haben und den City-Schlüssel ersetzen möchten, wenn der Wert York enthält, funktioniert dies ebenfalls.

myMap.collect { 
    case ("city", Some(city)) if(city.contains("York")) => "NewYork" 
    case (k, v) if v.isDefined => k -> v.get 
    } 
+0

Dafür bekomme ich Fehler wie: '=>' erwartet, aber String-Literal gefunden. – b1399877

+0

ah ja, repariert es –

0

Kleine Korrektur zu Bruce Antwort

myMap.collect { 
    case ("city", Some(city)) if(city.contains("York")) => "NewYork" 
    case (k, v) if v.isDefined => k -> v.get 
} 

Würde in einer Karte nicht zur Folge hat, sondern ein Iterable

myMap.collect { 
    case ("city", Some(city)) if(city.contains("York")) => "city" -> "NewYork" 
    case (k, Some(v)) => k -> v 
} 

Würde besser

Verwandte Themen