Quando Java è stato progettato per la prima volta, è stato ritenuto opportuno escludere funzioni anonime. Posso pensare a due ragioni (ma potrebbero essere diverse da quelle ufficiali):
- Java è stato progettato come linguaggio orientato agli oggetti senza funzioni, quindi non era molto naturale avere funzioni anonime in una lingua senza funzioni. O almeno, questo avrebbe influenzato molto il design della lingua.
- Le funzioni anonime non erano popolari nelle comunità di programmatori che Java avrebbe dovuto attrarre (C, C ++, Pascal?). Anche ora, molti programmatori Java sembrano considerare queste funzionalità piuttosto esotiche (ma questo probabilmente cambierà molto rapidamente con Java 8).
Negli anni seguenti, come ha spiegato Robert Harvey, la politica di Sun era sempre quella di mantenere Java compatibile e molto stabile.
D'altra parte, sono emersi altri linguaggi concorrenti (il più importante è C #, che è nato come un clone di Java e poi ha preso la sua direzione di sviluppo).
Le lingue concorrenti hanno messo Java sotto pressione per due motivi:
Potere espressivo
Le nuove funzionalità possono semplificare la scrittura di alcuni idiomi di programmazione, rendendo la lingua più attraente per i programmatori. Normalmente l'insieme delle funzionalità fornite da un linguaggio è un compromesso tra potenza espressiva, complessità del linguaggio, coerenza del design: l'aggiunta di più caratteristiche rende un linguaggio più espressivo ma anche più complesso e difficile da padroneggiare.
Comunque, negli ultimi anni i concorrenti di Java hanno aggiunto molte nuove funzionalità che Java non aveva, e questo può essere considerato un vantaggio.
Hype
Sì, sfortunatamente questo è un fattore nella scelta della tecnologia, almeno da quello che posso vedere nella mia esperienza quotidiana come programmatore: uno strumento deve avere una certa caratteristica, anche se la maggior parte dei membri del team non sa come usalo e chi potrebbe usarlo non ne ha più bisogno.
Hype può essere ancora più importante per le persone non tecniche come i manager, che possono essere quelli che decidono la piattaforma per un determinato progetto. I manager a volte ricordano solo alcune parole chiave come lambda, parallelismo, multicore, programmazione funzionale, cloud computing, ... Se la nostra tecnologia di scelta ha un marchio verde
su ogni elemento della lista, quindi siamo aggiornati.
Quindi IMO per qualche tempo Java è stato catturato tra
- la politica originale della stabilità del linguaggio e della semplicità del design, un'enorme base di codice e una comunità di sviluppatori da un lato e
- la pressione dei linguaggi concorrenti che potrebbe attirare i programmatori Java, C # in primo luogo e poi Scala, Clojure, F # (nome di cui sono a conoscenza, potrebbero essercene altri).
Alla fine Oracle ha deciso di aggiornare Java per renderlo più competitivo.
A mio parere, le nuove funzionalità riguardano in particolare i programmatori Java che potrebbero essere tentati di passare a C # e che vedono altri linguaggi come Scala e Clojure come troppo diversi da Java.
D'altra parte, gli sviluppatori che hanno una certa esperienza con la programmazione funzionale e desiderano ancora utilizzare la JVM probabilmente sono già passati a
Scala, Clojure o un'altra lingua.
Quindi le nuove funzionalità di Java 8 renderanno Java più potente come linguaggio e l'obiettivo dichiarato è la simultanea e la programmazione parallela, ma l'aggiornamento sembra riguardare anche gli aspetti del marketing (Mark Reinhold, chief architect per Java presso Oracle, ha dichiarato: "Alcuni direbbero che l'aggiunta di espressioni Lambda è solo per stare al passo con i ragazzi fantastici, e c'è del vero, ma la vera ragione sono i processori multicore, il modo migliore per gestirli è con Lambda", vedi questo articolo ).
Quindi, sì, molte (tutte) funzionalità di Java 8 erano già note, ma perché e quando una funzionalità viene aggiunta a una lingua dipende da molti fattori: il pubblico di destinazione,
comunità esistente, base di codice esistente, concorrenti, marketing, ecc.
Modifica
Una breve nota riguardante "... Ho letto degli stream in SIC (1996).": vuoi dire che hai bisogno di Java 8 lambdas per implementare i flussi? In realtà puoi implementarli usando classi interne anonime.