Sto imparando Scala e sono un po 'sconcertato da tutti i metodi (funzioni di ordine superiore) disponibili nelle raccolte. Quali producono più risultati della collezione originale, quali producono meno e quali sono più appropriati per un determinato problema? Anche se sto studiando Scala, penso che questo riguarderebbe la maggior parte dei linguaggi funzionali moderni (Clojure, Haskell) e anche di Java 8 che introduce questi metodi sulle raccolte Java.
In particolare, ora mi chiedo sulla mappa con filtro vs. piega / riduzione. Mi ha fatto molto piacere che l'uso di foldRight () possa produrre lo stesso risultato di una mappa (...). Filter (...) con un solo attraversamento della collezione sottostante. Ma un amico ha sottolineato che foldRight () può forzare l'elaborazione sequenziale mentre map () è più amichevole rispetto all'elaborazione da parte di più processori in parallelo. Forse questo è il motivo per cui mapReduce () è così popolare?
Più in generale, a volte sono ancora sorpreso quando concateno molti di questi metodi per recuperare un elenco (List ()) o per passare un elenco (List ()) e recuperare solo un elenco (). Ad esempio, quando dovrei usare:
collection.map(a => a.map(b => ...))
vs.
collection.map(a => ...).map(b => ...)
Il comando for / yield non fa nulla per aiutare questa confusione. Sto chiedendo la differenza tra un'operazione "fold" e "unfold"?
Sto cercando di intromettermi troppe domande in una? Penso che ci possa essere un concetto di fondo che, se ho capito, potrebbe rispondere a tutte queste domande, o almeno legare insieme le risposte.