Cuando se diseñó Java por primera vez, se consideró apropiado omitir funciones anónimas. Puedo pensar en dos razones (pero pueden ser diferentes de las oficiales):
- Java fue diseñado como un lenguaje orientado a objetos sin funciones, por lo que no era muy natural tener funciones anónimas en un lenguaje sin funciones. O al menos, esto habría influido mucho en el diseño del lenguaje.
- Las funciones anónimas no eran populares en las comunidades de programadores que Java debía atraer (C, C ++, Pascal?). Incluso ahora, muchos programadores de Java parecen considerar estas características bastante exóticas (pero esto probablemente cambiará muy rápidamente con Java 8).
En los años siguientes, como Robert Harvey ha explicado, la política de Sun siempre fue mantener Java compatible con versiones anteriores y muy estable.
Por otro lado, han surgido otros lenguajes competidores (el más importante es C #, que nació como un clon de Java y luego tomó su propia dirección de desarrollo).
Los lenguajes competitivos han puesto a Java bajo presión por dos razones:
Poder expresivo
Las nuevas funciones pueden facilitar la escritura de ciertos modismos de programación, lo que hace que el lenguaje sea más atractivo para los programadores. Normalmente, el conjunto de características proporcionadas por un lenguaje es un compromiso entre el poder expresivo, la complejidad del lenguaje y la coherencia del diseño: agregar más características hace que un lenguaje sea más expresivo pero también más complejo y difícil de dominar.
De todos modos, en los últimos años, los competidores de Java agregaron muchas características nuevas que Java no tenía, y esto puede considerarse una ventaja.
Bombo
Sí, desafortunadamente este es un factor en la elección de la tecnología, al menos por lo que puedo ver en mi experiencia diaria como programador: una herramienta debe tener una determinada característica, incluso si la mayoría de los miembros del equipo no saben cómo usarla y aquellos que podrían usarlo no lo necesitan la mayoría de las veces.
El bombo puede ser aún más importante para las personas no técnicas como los gerentes, quienes pueden ser quienes deciden la plataforma para un determinado proyecto. Los gerentes a veces solo recuerdan algunas palabras clave como lambda, paralelismo, multinúcleo, programación funcional, computación en la nube, ... Si nuestra tecnología de elección tiene una marca verde en cada elemento de la lista, entonces estamos actualizados.
Así que IMO por algún tiempo Java ha sido atrapado entre
- la política original de estabilidad del lenguaje y simplicidad de diseño, una gran base de código y comunidad de desarrolladores por un lado, y
- la presión de los lenguajes competitivos que podrían atraer a los programadores de Java, C # al principio, y luego Scala, Clojure, F # (nombro los que conozco, puede haber otros).
Finalmente, Oracle decidió actualizar Java para hacerlo más competitivo. En mi opinión, las nuevas características se dirigen especialmente a los programadores de Java que podrían verse tentados a cambiar a C # y que ven otros lenguajes como Scala y Clojure como demasiado diferentes de Java. Por otro lado, los desarrolladores que tienen algo de experiencia con la programación funcional y todavía quieren usar la JVM probablemente ya se hayan cambiado a Scala, Clojure u otro idioma.
Por lo tanto, las nuevas características de Java 8 harán que Java sea más poderoso como lenguaje y el enfoque declarado es la programación concurrente y paralela, pero la actualización parece abordar también los aspectos de marketing (Mark Reinhold, arquitecto jefe de Java en Oracle, dijo: "Algunos lo harían decir que agregar expresiones Lambda es solo para mantenerse al día con los niños geniales, y hay algo de verdad en eso, pero la verdadera razón son los procesadores multinúcleo; la mejor manera de manejarlos es con Lambda ", vea este artículo ).
Entonces, sí, muchas (todas) las características de Java 8 ya eran bien conocidas, pero por qué y cuándo se agrega una característica a un idioma depende de muchos factores: audiencia objetivo, comunidad existente, base de código existente, competidores, marketing, etc.
EDITAR
Una breve nota con respecto a "... había leído sobre transmisiones en SIC (1996)": ¿quiere decir que necesita Java 8 lambdas para implementar transmisiones? En realidad, puedes implementarlos usando clases internas anónimas.