2016-08-26 2 views
0

sagen für z.B.mehrere Filterbedingungen anwenden und nur ein Element aus einer Liste erzeugen

scala> case class Entitlement(read: Boolean, edit: Boolean, create: Boolean, delete: Boolean) 
defined class Entitlement 

scala> List (Entitlement(read= true, edit = true, create= false, delete =false),Entitlement(read= true, edit = false, create= false, delete =false),Entitlement(read= true, edit = true, create= false, delete =true)) 
res0: List[Entitlement] = List(Entitlement(true,true,false,false), 
Entitlement(true,false,false,false), Entitlement(true,true,false,true)) 

Gibt es eine Möglichkeit, eines zu erstellen und eine ONLY Entitlement(true,true,false,true) mit einem einzigen Durchlauf einer Liste res0, so dass es durch die Liste gehen werde und wenn read=true das ist gefunden das endgültige read Privileg else default value for read=false - wenn edit=true das ist gefunden das letzte edit Privileg else default value for edit=false und so weiter. in diesem Spielzeug Beispiel create=false in allen der Entitlement Elemente im List warum Endergebnis

Entitlement(true,true,false,true) 

Antwort

3

Sie sich Ihre Liste falten und or zusammen mit den entsprechenden Werten der Entitlement s. Sie beginnen mit einem Entitlement mit allen Werten, die auf false festgelegt sind.

res0.fold(Entitlement(false, false, false, false))((e1, e2) => 
    Entitlement(
     e1.read || e2.read, 
     e1.edit || e2.edit, 
     e1.create || e.create, 
     e1.delete || e2.delete)) 
0

Sie können das gleiche auch mit reduzieren erreichen. Unten ist ein Beispiel. Der Vorteil hier ist, dass Sie keinen Anfangswert übergeben müssen und es intuitiver ist.

res0.reduce((e1, e2) => Entitlement(e1.read | e2.read, e1.edit | e2.edit, e1.create | e2.create, e1.delete | e2.delete)) 
+0

Der Nachteil ist, dass es nicht funktioniert, wenn 'res0' leer sein kann. –

+0

Ja. Zustimmen. Wenn die Liste leer sein kann, ist fold die richtige Option. – Jegan

Verwandte Themen