Implemente operações básicas com listas.
Em linguagens funcionais, operações com listas como length, map e reduce são muito comuns.
Implemente uma série de operações básicas com listas, sem usar funções já existentes.
O número e os nomes exatos das operações a serem implementadas vão depender da trilha, para evitar conflitos com nomes já existentes, mas as operações gerais que você vai implementar incluem:
append (dadas duas listas, adicione todos os itens da segunda lista ao final da primeira lista);concatenate (dada uma série de listas, combine todos os itens de todas as listas em uma única lista achatada);filter (dados um predicado e uma lista, retorne a lista de todos os itens para os quais predicate(item) é True);length (dada uma lista, retorne o número total de itens dentro dela);map (dadas uma função e uma lista, retorne a lista dos resultados de aplicar function(item) a todos os itens);foldl (dados uma função, uma lista e um acumulador inicial, faça o fold (reduza) de cada item no acumulador, a partir da esquerda);foldr (dados uma função, uma lista e um acumulador inicial, faça o fold (reduza) de cada item no acumulador, a partir da direita);reverse (dada uma lista, retorne uma lista com todos os itens originais, mas em ordem inversa).Observe que a ordem em que os argumentos são passados para as funções de fold (foldl, foldr) faz diferença.
Em Java, considera-se boa prática usar métodos de instância em vez de métodos de classe. No entanto, existem situações em que é absolutamente apropriado que uma função seja static. Como as classes em Java são fechadas para modificação (ou seja, você não pode adicionar membros a uma classe fora da sua definição, como pode fazer em outras linguagens, como Ruby ou JavaScript), você não consegue adicionar um novo comportamento diretamente à classe. O que fazer se você ainda quiser definir um comportamento para um determinado tipo? A solução idiomática nesse caso é escrever um método utilitário.
Coleções desses tipos de métodos costumam ser chamadas de "classes utilitárias". Exemplos dessas classes na própria JRE incluem Arrays e Collections.
Neste exercício, queremos que uma List tenha métodos map(), reduce(), filter(), etc. Ela não tem, então estamos usando métodos estáticos.
Os métodos foldLeft e foldRight são funções "fold", um conceito bem conhecido no mundo da programação funcional, mas nem tanto no mundo da orientação a objetos. Veja a página da Wikipédia sobre folding para contexto geral e dicas de assinatura/implementação.
Crie sua conta no Exercism para aprender e dominar Java com 26 conceitos158 exercícios e mentoria humana de verdade, tudo de graça.
Aproveite uma introdução prática à recursão, explore as alternativas imperativas e funcionais para Operações com Listas e mergulhe a fundo na recursão de cauda e nas funções acumuladoras.