Quando Java è stato progettato per la prima volta, si è ritenuto opportuno escludere funzioni anonime. Posso pensare a due motivi (ma potrebbero essere diversi da quelli ufficiali):
- Java è stato progettato come un linguaggio orientato agli oggetti senza funzioni, quindi non era molto naturale avere funzioni anonime in un linguaggio senza funzioni. O almeno, ciò avrebbe influenzato molto il design della lingua.
- Le funzioni anonime non erano popolari nelle comunità di programmatori che Java doveva 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 è sempre stata quella di mantenere Java compatibile con le versioni precedenti 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).
I linguaggi in competizione hanno messo Java sotto pressione per due motivi:
Potenza espressiva
Le nuove funzionalità possono rendere più semplice la scrittura di alcuni idiomi di programmazione, rendendo il linguaggio più attraente per i programmatori. Normalmente l'insieme di funzionalità fornite da una lingua è un compromesso tra potenza espressiva, complessità del linguaggio, coerenza progettuale: l'aggiunta di più funzionalità 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.
montatura
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 funzionalità, anche se la maggior parte dei membri del team non sa come usarlo e quelli che sarebbero in grado di usarlo non ne hanno bisogno la maggior parte delle volte.
L'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 preferita ha un segno verde su ogni elemento dell'elenco, allora siamo aggiornati.
Quindi IMO da tempo Java è stato intercettato tra
- la politica originale di stabilità del linguaggio e semplicità di progettazione, una base di codice enorme e una comunità di sviluppatori da un lato, e
- la pressione di linguaggi concorrenti che potrebbero attrarre programmatori Java, inizialmente C #, e poi Scala, Clojure, F # (chiamo quelli di cui sono a conoscenza, potrebbero essercene altri).
Alla fine Oracle ha deciso di aggiornare Java per renderlo più competitivo. A mio avviso, le nuove funzionalità riguardano soprattutto i programmatori Java che potrebbero essere tentati di passare a C # e che vedono altre lingue come Scala e Clojure come troppo diverse da Java. D'altra parte, gli sviluppatori che hanno una certa esperienza con la programmazione funzionale e vogliono ancora usare 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 programmazione simultanea e parallela, ma l'aggiornamento sembra indirizzare anche gli aspetti di marketing (Mark Reinhold, capo architetto di Java presso Oracle, ha dichiarato: "Alcuni avrebbero dire che aggiungere espressioni Lambda è solo per stare al passo con i ragazzi fantastici, e c'è del vero in questo, ma il vero motivo sono i processori multicore; il modo migliore per gestirli è con Lambda ", vedi questo articolo ).
Quindi, sì, molte (tutte) funzionalità Java 8 erano già ben note, ma perché e quando una funzionalità viene aggiunta a una lingua dipende da molti fattori: pubblico di destinazione, comunità esistente, base di codice esistente, concorrenti, marketing, ecc.
MODIFICARE
Una breve nota riguardante "... avevo letto degli stream in SIC (1996).": Vuoi dire che hai bisogno di Java 8 lambdas per implementare gli stream? In realtà puoi implementarli usando classi interne anonime.