Implementa le operazioni di base sugli array.
Nei linguaggi funzionali, le operazioni sugli array come length, map e reduce sono molto comuni.
Implementa una serie di operazioni di base sugli array, senza usare le funzioni esistenti.
Il numero preciso e i nomi delle operazioni da implementare dipenderà dal track, per evitare conflitti con i nomi già esistenti, ma le operazioni generali che implementerai includono:
append (dati due array, aggiungi tutti gli elementi del secondo array alla fine del primo array);concatenate (data una serie di array, combina tutti gli elementi di tutti gli array in un unico array appiattito);filter (dati un predicato e un array, restituisci l'array di tutti gli elementi per cui predicate(item) è True);length (dato un array, restituisci il numero totale di elementi che contiene);map (date una funzione e un array, restituisci l'array dei risultati dell'applicazione di function(item) a tutti gli elementi);foldl (date una funzione, un array e un accumulatore iniziale, piega (riduci) ogni elemento nell'accumulatore da sinistra);foldr (date una funzione, un array e un accumulatore iniziale, piega (riduci) ogni elemento nell'accumulatore da destra);reverse (dato un array, restituisci un array con tutti gli elementi originali, ma in ordine inverso).Nota: l'ordine in cui gli argomenti vengono passati alle funzioni fold (foldl, foldr) è significativo.
In Java è considerata una buona pratica usare metodi di istanza invece dei metodi di classe. Tuttavia, ci sono situazioni in cui è assolutamente appropriato che una funzione sia static. Dato che le classi in Java sono chiuse alle modifiche (cioè non puoi aggiungere membri a una classe al di fuori della sua definizione, come invece puoi fare in altri linguaggi come Ruby o JavaScript), non puoi aggiungere nuovi comportamenti direttamente alla classe. Cosa fare se vuoi comunque definire un comportamento per un dato tipo? La soluzione idiomatica in questo caso è scrivere un metodo di utilità.
Insiemi di metodi di questo tipo vengono spesso chiamati «classi di utilità». Esempi di tali classi all'interno della JRE includono Arrays e Collections.
In questo esercizio vogliamo che una List abbia metodi map(), reduce(), filter(), ecc. Non li ha, quindi usiamo metodi statici.
I metodi foldLeft e foldRight sono funzioni «fold», un concetto ben noto nel mondo della programmazione funzionale, ma meno in quello orientato agli oggetti. Vedi la pagina di Wikipedia sul folding per un contesto generale e suggerimenti su firma e implementazione.
Iscriviti a Exercism per imparare e padroneggiare Java con 26 concetti158 esercizi e il mentoring di persone reali, tutto gratis.
Goditi un'introduzione pratica alla ricorsione, esplora le alternative imperative e funzionali a Operazioni su array e approfondisci la ricorsione in coda e le funzioni di accumulo.