Quando o Java foi projetado, foi considerado apropriado excluir funções anônimas. Eu posso pensar em duas razões (mas elas podem ser diferentes das oficiais):
- O Java foi projetado como uma linguagem orientada a objetos sem funções, portanto, não era muito natural ter funções anônimas em uma linguagem sem funções. Ou pelo menos, isso teria influenciado muito o design da linguagem.
- As funções anônimas não eram populares nas comunidades de programadores que o Java deveria atrair (C, C ++, Pascal?). Mesmo agora, muitos programadores de Java parecem considerar esses recursos bastante exóticos (mas isso provavelmente mudará muito rapidamente com o Java 8).
Nos anos seguintes, como Robert Harvey explicou, a política da Sun era sempre manter o Java compatível com versões anteriores e muito estável.
Por outro lado, surgiram outras linguagens concorrentes (a mais importante é o C #, que nasceu como um clone de Java e depois seguiu sua própria direção de desenvolvimento).
As linguagens concorrentes pressionaram o Java por dois motivos:
Poder expressivo
Novos recursos podem facilitar a escrita de certos idiomas de programação, tornando a linguagem mais atraente para os programadores. Normalmente, o conjunto de recursos fornecidos por uma linguagem é um compromisso entre poder expressivo, complexidade da linguagem e coerência do projeto: adicionar mais recursos torna a linguagem mais expressiva, mas também mais complexa e difícil de dominar.
De qualquer forma, nos últimos anos, os concorrentes do Java adicionaram muitos novos recursos que o Java não possuía, e isso pode ser considerado uma vantagem.
Hype
Sim, infelizmente, esse é um fator na escolha da tecnologia, pelo menos pelo que posso ver na minha experiência diária como programador: uma ferramenta deve ter um determinado recurso, mesmo que a maioria dos membros da equipe não saiba como usá-la e aqueles que poderiam usá-lo não precisam disso na maioria das vezes.
O hype pode ser ainda mais importante para pessoas não técnicas, como gerentes, que podem decidir quem é a plataforma para um determinado projeto. Às vezes, os gerentes só lembram algumas palavras-chave como lambda, paralelismo, multicore, programação funcional, computação em nuvem, ... Se nossa tecnologia de escolha tem uma marca verde em cada item da lista, estamos atualizados.
Então, por algum tempo, o IMO Java foi capturado entre
- a política original de estabilidade de linguagem e simplicidade de design, uma enorme base de códigos e comunidade de desenvolvedores, por um lado, e
- a pressão de linguagens concorrentes que poderiam atrair programadores de Java, C # a princípio, e depois Scala, Clojure, F # (eu cito os que tenho conhecimento, pode haver outros).
Eventualmente, a Oracle decidiu atualizar o Java para torná-lo mais competitivo. Na minha opinião, os novos recursos tratam especialmente de programadores Java que podem ser tentados a mudar para C # e que veem outras linguagens como Scala e Clojure como muito diferentes de Java. Por outro lado, os desenvolvedores que têm alguma experiência com programação funcional e ainda desejam usar a JVM provavelmente já mudaram para Scala, Clojure ou outro idioma.
Portanto, os novos recursos do Java 8 tornarão o Java mais poderoso como linguagem e o foco declarado é a programação simultânea e paralela, mas a atualização parece abordar também os aspectos de marketing (Mark Reinhold, arquiteto chefe de Java da Oracle, disse: "Alguns diriam digamos que adicionar expressões Lambda é apenas para acompanhar as crianças legais, e há alguma verdade nisso, mas o verdadeiro motivo são processadores com vários núcleos; a melhor maneira de lidar com eles é com o Lambda ", consulte este artigo ).
Portanto, sim, muitos (todos) os recursos do Java 8 já eram bem conhecidos, mas por que e quando um recurso é adicionado a uma linguagem depende de muitos fatores: público-alvo, comunidade existente, base de código existente, concorrentes, marketing etc.
EDITAR
Uma breve observação sobre "... eu tinha lido sobre fluxos na SIC (1996).": Você quer dizer que precisa do Java 8 lambdas para implementar fluxos? Na verdade, você pode implementá-los usando classes internas anônimas.