2016-07-08 14 views
1

Ich mache so etwas wie den folgenden Code in Scala Sprache.Gibt es eine Möglichkeit zu vermeiden, ._1 zu verwenden, um besser lesbar zu sein

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date)) 
val filteredCars = newCars.filter(_._1 != 0 && _._2.isEmpty && _._3.isEmpty) 

Gibt es eine Möglichkeit, die Verwendung von _._ 1, _._ 2 und 3 _._ zu sein besser lesbar zu vermeiden?

Es gibt etwas in Scala Sprache wie der folgende Code?

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date)) 
val filteredCars = newCars. 
    filter((id, name, date) => id != 0 && name.isEmpty && date.isEmpty) 
+1

'Filter (Fall (a, b, c) => ...)' –

+0

Ich glaube nicht, 'Karte ((_ Name, _.. Platte, _.date)) 'funktioniert, wie Sie wollen. – jwvh

Antwort

2

können Sie Teil verwenden Funktionen

newCars.filter { 
    case (id, name, date) => id != 0 && name.isEmpty && date.isEmpty 
} 

Teilfunktionen auch außerhalb Ihrer Filter, zusammengesetzt und wiederverwendet definiert werden.

Wenn Sie dieses spezielle Format verwenden, könnten Sie an Fallklassen interessiert sein. Wenn Sie bereits wissen sie, vielleicht sollten Sie wissen, dass Sie sie direkt von Tupel mit dem .tupled Methode

.map(x=>MyCaseClass.tupled(x)) 
+0

Ich liebe diesen Teil von Scala! – JakeWilson801

0

Zuerst bauen kann, wird der Code nicht kompilieren: Sie haben map ein Tupel von 3 Funktionen übernehmen, und filter Nimm eine Funktion mit 3 Parametern. Ich nehme an, Sie

val newCars = existingCars.filter(_.id > 0).map(x => (x.name, x.plate, x.date)) 
val filteredCars = newCars.filter(x => x._1 != 0 && x._2.isEmpty && x._3.isEmpty) 

Für diesen Fall gedacht würde ich einfach erste Filterung vorschlagen:

existingCars.filter(_.id > 0).filter(car => car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date)) 

(vermutlich ist etwas in dem Zustand, in Ihrer Frage gegeben gemischt, da _._1-name entspricht, nicht zu id). Und dann können Sie die beiden filter s vereinfachen:

existingCars.filter(car => car.id > 0 && car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date)) 
1

zu den anderen Antworten hinzuzufügen, können Sie collect verwenden, die eine filter und map kombiniert. Denken Sie daran, geschweifte Klammern {} zu verwenden, wenn Sie case verwenden.

Man könnte so etwas wie tun:

val newCars = List( 
    ("123ABC", "Chevy", "2016"), 
    ("234BCD","Ford","2016"), 
    ("345DEF","","") 
) 

val filteredCars = newCars.collect{ 
    case (id,name,date) if id.nonEmpty && name.isEmpty && date.isEmpty => 
    (id,name,date) 
} 
Verwandte Themen