Ich habe einen Vektor von Vektoren, auf die ich zugreife, um eine boolesche Funktion anzuwenden. das heißtGibt es eine einfache Möglichkeit, in verschachtelten Seqs in Scala aus dem Rahmen zu gehen?
Vector[Vector[T]]
, wo ich etwas entlang der Linien von f(myVector(i)(j))
ausführen werde, wo f vom Typ T => Boolean
.
Aber das überprüft Grenzen nicht, und ich kann etwas wirklich elegantes nicht bekommen.
kann ich applyOrElse
verwenden: myVector.applyOrElse(i, (_:Int) => Vector.empty).applyOrElse (j, (_:Int) => defaultT)
wo f(defaultT)
false
zurückkehren würde, aber ich wünschte, ich nur einen Standardwert statt einer Funktion einstellen könnte.
I Lift benutzen könnte mir ein Option
zu geben, aber sie besteht nicht gut auf der zweiten Ebene: myVector.lift(i) map (_.lift(j) map f getOrElse false) getOrElse false
Welche Arbeit leistet, aber immer noch sehr schwer zu lesen ist.
Und dann gibt es Standard-if/else Blöcke:
if (myVector.size <= i) false
else {
val myVector2 = levelVector(i)
if (myVector2.size <= j) false
else f(myVector2(j))
}
Es scheint nur, wie etwas, das in der Lage sein sollte, zerlegt werden leichter als das, was ich erreichen kann. Und wenn ich eine dritte Ebene hinzufüge, wird es noch hässlicher.
Gibt es andere Optionen?
Haftungsausschluss: Diese von Coursera des progfun natürlich angepasst ist
Fantastisch - Ich habe versucht, die Option zu halten, aber die Grundlagen des Listenverständnisses vergessen. Vielen Dank. – Stephen
2.10 kürzere Version: 'myVector.lift (i) .flatMap (_. Lift (j)). Exists (f)' – lpandzic