Ho il seguente problema in scala. Devo trovare il primo elemento in un elenco che soddisfi una funzione di predicato con due condizioni in OR. Il problema è che mi piacerebbe ottenere l'elemento ma anche sapere quale delle due condizioni è stata soddisfatta. Ecco un semplice esempio:Trovare elementi in una lista scala e anche sapere quale predicato è stato soddisfatto
val l1 = List("A", "B", "AA", "BB")
val l2 = List("AA", "BB", "A", "B")
def c1(s: String) = s.startsWith("B")
def c2(s: String) = s.length == 2
println(l1.find(s => c1(s) || c2(s)))
println(l2.find(s => c1(s) || c2(s)))
risultato è:
Some(B)
Some(AA)
Per il caso L1 mi piacerebbe avere qualche valore di ritorno (una stringa per esempio) che indica che c1 è stata soddisfatta (c2 per la l2 caso). Una possibile soluzione potrebbe essere quella di definire una var prima del test e impostarla all'interno delle funzioni c1 e c2, ma mi piacerebbe trovare una soluzione più "di stile funzionale", magari qualcosa che restituisca una tupla come: (elemento trovato, condizione soddisfatto).
Grazie in anticipo per l'aiuto
Generalizzato a un elenco di predicati 'def findPredsOr [T] (l: List [T], ps: List [T => Boolean]): Option [(T , List [Boolean])] = l.view.map (el => (el, ps.map (_. Apply (el)))). Find (t => t._2.contains (true)) ' – retronym
Ottima soluzione. Grazie per farmi scoprire la vista/proiezione, mi sembra molto utile! –