Implementa operaciones básicas con listas.
En los lenguajes funcionales, las operaciones con listas como length, map y reduce son muy habituales. Implementa una serie de operaciones básicas con listas, sin usar las funciones que ya existen.
El número y los nombres exactos de las operaciones que hay que implementar dependerán de cada track, para evitar conflictos con nombres ya existentes, pero las operaciones generales que vas a implementar son:
append (dadas dos listas, añade todos los elementos de la segunda lista al final de la primera);concatenate (dada una serie de listas, combina todos los elementos de todas las listas en una sola lista aplanada);filter (dados un predicado y una lista, devuelve la lista de todos los elementos para los que predicate(item) es True);length (dada una lista, devuelve el número total de elementos que contiene);map (dadas una función y una lista, devuelve la lista de los resultados de aplicar function(item) a todos los elementos);foldl (dadas una función, una lista y un acumulador inicial, pliega (reduce) cada elemento dentro del acumulador desde la izquierda);foldr (dadas una función, una lista y un acumulador inicial, pliega (reduce) cada elemento dentro del acumulador desde la derecha);reverse (dada una lista, devuelve una lista con todos los elementos originales, pero en orden inverso).Ten en cuenta que el orden en el que se pasan los argumentos a las funciones de plegado (foldl, foldr) es significativo.
En Java se considera una buena práctica usar métodos de instancia en lugar de métodos de clase. Sin embargo, hay situaciones en las que es totalmente apropiado que una función sea static. Como las clases en Java están cerradas a la modificación (es decir, no puedes añadir miembros a una clase fuera de su definición como sí puedes hacer en otros lenguajes como Ruby o JavaScript), no puedes añadir comportamiento nuevo directamente a la clase. ¿Qué hacer si aun así quieres definir comportamiento para un tipo determinado? La solución idiomática en este caso es escribir un método de utilidad.
Las agrupaciones de este tipo de métodos suelen denominarse «clases de utilidad». Entre los ejemplos de este tipo de clases dentro del JRE se encuentran Arrays y Collections.
En este ejercicio queremos que un array tenga métodos map(), reduce(), filter(), etc. No los tiene, así que usamos métodos estáticos.
Los métodos foldLeft y foldRight son funciones «fold», un concepto muy conocido en el mundo de la programación funcional, pero menos en el de la orientada a objetos. Consulta la página de Wikipedia sobre las funciones fold para obtener contexto general y pistas sobre la signatura y la implementación.
Regístrate en Exercism para aprender y dominar Java con 26 conceptos158 ejercicios y mentoría humana real, todo gratis.
Disfruta de una introducción práctica a la recursión, explora las alternativas imperativas y funcionales a Operaciones con arrays y sumérgete en la recursión de cola y las funciones acumuladoras.