che sto cercando di ricreare word count mappa di Hadoop/ridurre la logica in un programma semplice per imparare ScalaModo idiomatico per ridurre un elenco di coppie in una mappa di chiavi e il loro conteggio aggregato?
Questo è quello che ho finora
val words1 = "Hello World Bye World"
val words2 = "Hello Hadoop Goodbye Hadoop"
val input = List(words1,words2)
val mapped = input.flatMap(line=>line.split(" ").map(word=>word->1))
//> mapped : List[(String, Int)] = List((Hello,1), (World,1), (Bye,1),
// (World,1), (Hello,1), (Hadoop,1),
// (Goodbye,1), (Hadoop,1))
mapped.foldLeft(Map[String,Int]())((sofar,item)=>{
if(sofar.contains(item._1)){
sofar.updated(item._1, item._2 + sofar(item._1))
}else{
sofar + item
}
})
//>Map(Goodbye -> 1, Hello -> 2, Bye -> 1, Hadoop -> 2, World -> 2)
Questo sembra funzionare, ma sono sicuro che ci è un modo più idiomatico per gestire la parte ridurre (foldLeft)
stavo pensando forse un multimap, ma ho una sensazione Scala ha un modo per farlo facilmente
c'è? per esempio. un modo per aggiungere a una mappa e, se la chiave esiste, invece di sostituirla, aggiungendo il valore al valore esistente. Sono sicuro di aver visto questa domanda da qualche parte, ma non sono riuscita a trovarla e nemmeno la risposta.
Lo so groupBy
è il modo per farlo probabilmente nel mondo reale, ma sto cercando di implementarlo il più vicino possibile alla mappa originale/ridurre la logica nel link sopra.
Nice, non ha ancora giocato con scalaz . Questo è un "Guava per Scala" in termini laici? –
Una specie di suppongo.Scalaz è fondamentalmente una libreria che usa "pimps" (usando il pattern Pimp my Library) di default di Scala, con alcuni componenti di scelta che prendono le idee da Haskell e dalla teoria delle categorie. È progettato per consentire a Scala di essere utilizzato in uno stile molto più "classicamente funzionale" consentito dalle librerie predefinite. Quindi ottieni cose come monade di stato, funtori applicativi, astrazioni IO ecc. Cose che richiedono un po 'di tempo per capire, ma sono davvero utili. –
@EranMedan Direi Haskell per Scala –