A volte incontriamo una situazione in cui dovremmo iterare (o mappare) su una raccolta, applicando la stessa procedura (funzione) per tutti gli elementi tranne il primo. L'esempio più semplice è trovare l'elemento massimo della raccolta, ma non è buono: l'operazione qui è idempotente. Un esempio più realistico è il dumping della tabella per porzioni: alla prima richiesta creiamo un file con l'intestazione per le colonne, quindi lo popoliamo.
Qual è l'approccio comune (o il modo più idiomatico) per l'implementazione di questo modello? Sono interessato a paradigmi di programmazione sia imperativi che funzionali.
Alcune varianti di possibili implementazioni (pseudocodice c-like):
primo (imperativo)
funcFirst(collection[0]); //duplicate code if funcFirst is something1 + func() + something2
for (int i = 1; i < collection.size(); i++){
func(collection[i]);
}
secondo (imperativo)
for (int i = 0; i < collection.size(); i++){
if (i == 0) //too many extra checks
funcFirst(collection[0]);
else
func(collection[i]);
}
terzo (imperativo)
for (int i = 0; i < collection.size(); i++){
if (i == 0) //too many extra checks
initSomenthing(collection[0]); //double read of collection[0]
func(collection[i]);
}
primo (funzionale)
funcFirst(collection.first()) //duplicate code if funcFirst is something1 + func() + something2
collection.drop(1).map( func )
secondo (funzionale)
collection.iterateWithIndex.map (if index == 0 funcFirst else func)
terzo (funzionale)
collection.fold (init(collection.first), func) //double read of collection[0]