I einen Code haben, wie zum Beispiel:Scala, das Filter eine Sammlung basierend auf mehreren Bedingungen
val strs = List("hello", "andorra", "trab", "world")
def f1(s: String) = !s.startsWith("a")
def f2(s: String) = !s.endsWith("b")
val result = strs.filter(f1).filter(f2)
nun, f1 und f2 sollten, basierend auf einer Bedingung angewandt werden, wie zum Beispiel:
val tmp1 = if (cond1) strs.filter(f1) else strs
val out = if (cond2) tmp1.filter(f2) else tmp1
ist gibt es einen schöneren Weg, dies zu tun, ohne eine temporäre Variable zu verwenden tmp1
?
Eine Möglichkeit wäre auf einer Liste von Funktionen zu filtern, wie zB:
val fs = List(f1 _,f2 _)
fs.foldLeft(strs)((fn, list) => list.filter(fn))
aber dann würde ich eine Liste von Funktionen, basierend auf den Bedingungen bauen muß (und so würde ich das Problem, bewegt Verwenden einer temporären Variablenliste, um eine temporäre Funktionslistenvariable zu verwenden (oder ich müsste eine veränderbare Liste verwenden)).
Ich suche so etwas wie dieses (natürlich ist dies nicht kompilieren, sonst hätte ich schon die Antwort auf die Frage):
val result =
strs
.if(cond1, filter(f1))
.if(cond2, filter(f2))
Klingt wie Sie wollen eine Liste von Tupeln mit (Bedingung, FilterPredicate). Sie können diese Liste dann basierend darauf filtern, ob die Bedingung (z. B. _._ 1) gilt oder nicht. Jetzt haben Sie eine Liste von Funktionen, die Sie anwenden möchten. Sie können dies dann mit der Zeichenkette abbilden und mit && (logisch und) reduzieren. Entschuldigung, wenn es zu wellig ist. – Felix
danke, das ist auch eine gute Idee, aber ich sah etwas eher wie Noahs Antwort. –