Ho un nidificata struttura case
classi in un List
rimuovere elementi da un elenco di struttura case classe efficiente ed elegantemente
per semplicità utilizzerà segue come esempio -
case class Address(street: String, city: String, state: String, zipCode: Int)
case class Person(firstName: String, lastName: String, addresses: List[Address])
case class Department(people: List[Person])
dire c'è List[Department]
; ora se voglio creare un nuovo List[Department]
filtrando Address
per ogni Person
che non ha un valore specifico zipCode
; tradizionalmente possiamo fare seguente
def filterPersonsByAddress(dlist: List[Department]): List[Department] = {
dlist.map { d =>
val people = d.people.map { p =>
p.copy(addresses = p.addresses.filterNot(_.zipCode == 38978))}
d.copy(people=people)
}
}
Questo approccio non è performante come a seconda del livello di nidificazione può essere Big O (n^2) o Big O (n^3);
Sto cercando di apprendere le lenti tramite Monocle. Finora ciò che ho imparato è che le lenti sono utili quando devi "modificare" una struttura di classe case
profondamente annidata ma non hai ancora trovato un modo per "tagliare" parte della struttura nidificata in base a una condizione e restituire una nuova struttura . È possibile per via Monocle? Inoltre, non sono sicuro che le lenti saranno in grado di aiutare a raggiungere un tempo di Big O migliore?
Dato per determinare se i reparti devono essere nel nuovo reparto, è necessario esaminare tutti gli indirizzi di tutte le persone, quindi non vedo come può essere qualsiasi cosa tranne O (#d * #p * #a) . –
@TheArchetypalPaul: non è in disaccordo con il tuo commento. Ciò potrebbe tralasciare una parte "efficiente" della domanda; ancora alla ricerca di un modo elegante per fare questo per vedere se le lenti/Monocle possono aiutare lì. lo sai? –
Leggi il concetto chiamato "Lenti". Alcune librerie come Monocle/scalaz lo implementano. – Maxim