Implementa operações básicas com listas.
Em linguagens funcionais, operações sobre listas como length, map e reduce são muito comuns.
Implementa uma série de operações básicas com listas, sem usar as funções já existentes.
O número exato e os nomes das operações a implementar variam de track para track, para evitar conflitos com nomes já existentes, mas as operações gerais que vais implementar incluem:
append (dadas duas listas, acrescenta todos os itens da segunda lista ao fim da primeira lista);concatenate (dada uma série de listas, combina todos os itens de todas as listas numa única lista achatada);filter (dado um predicado e uma lista, devolve a lista de todos os itens para os quais predicate(item) é True);length (dada uma lista, devolve o número total de itens que ela contém);map (dada uma função e uma lista, devolve a lista dos resultados de aplicar function(item) a todos os itens);foldl (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da esquerda);foldr (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da direita);reverse (dada uma lista, devolve uma lista com todos os itens originais, mas pela ordem inversa).Repara que a ordem pela qual os argumentos são passados às funções de fold (foldl, foldr) é importante.
Em Java, considera-se boa prática usar métodos de instância em vez de métodos de classe. No entanto, há situações em que é perfeitamente adequado que uma função seja static. Como as classes em Java são fechadas à modificação (ou seja, não podes acrescentar membros a uma classe fora da sua definição, ao contrário do que acontece noutras linguagens como Ruby ou JavaScript), não podes acrescentar comportamento novo diretamente à classe. O que fazer se quiseres na mesma definir comportamento para um dado tipo? A solução idiomática, neste caso, é escrever um método utilitário.
Conjuntos destes métodos são muitas vezes designados por "classes utilitárias". Exemplos destas classes na JRE incluem Arrays e Collections.
Neste exercício queremos que uma List tenha métodos como map(), reduce(), filter(), etc. Não tem, por isso vamos usar métodos estáticos.
Os métodos foldLeft e foldRight são funções de "fold", um conceito bem conhecido no mundo da programação funcional, mas menos no da programação orientada a objetos. Vê a página da Wikipédia sobre folding para obteres contexto geral e sugestões de assinatura e implementação.
Inscreve-te no Exercism para aprenderes e dominares Java com 26 conceitos158 exercícios, e mentoria humana real, tudo grátis.
Desfruta de uma introdução prática à recursão, explora as alternativas imperativas e funcionais às Operações com listas e mergulha a fundo na recursão de cauda e nas funções acumuladoras.