ho un codice come:scala, filtrare una collezione basata su diverse condizioni
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)
ora, f1 e f2 dovrebbero essere applicati base a una condizione, come ad esempio:
val tmp1 = if (cond1) strs.filter(f1) else strs
val out = if (cond2) tmp1.filter(f2) else tmp1
è c'è un modo migliore per farlo, senza usare una variabile temporanea tmp1
?
Un modo potrebbe filtrare sulla base di un elenco di funzioni, come ad esempio:
val fs = List(f1 _,f2 _)
fs.foldLeft(strs)((fn, list) => list.filter(fn))
ma poi avrei bisogno di costruire una lista di funzioni in base alle condizioni (e così, vorrei spostare il problema di usare una variabile di lista di stringhe temporanea, di usare una variabile di lista di funzione temporanea (o dovrei avere bisogno di usare una lista mutabile)).
Sto cercando qualcosa di simile (naturalmente questo non viene compilato, altrimenti avrei già la risposta alla domanda):
val result =
strs
.if(cond1, filter(f1))
.if(cond2, filter(f2))
Sembra che tu desideri un elenco di tuple con (condizione, filtroPredicato). È quindi possibile filtrare questo elenco in base alla presenza o meno di una condizione (ad es. _._ 1). Ora hai un elenco di funzioni che vuoi applicare. È quindi possibile mappare questo con la stringa e ridurre con && (logica e). Scusa se è troppo mosso. – Felix
grazie, anche questa è una buona idea, ma stavo cercando qualcosa di più simile alla risposta di Noah. –