Kiedy po raz pierwszy zaprojektowano Javę, uznano za właściwe pominięcie funkcji anonimowych. Mogę wymyślić dwa powody (ale mogą się różnić od oficjalnych):
- Java została zaprojektowana jako język obiektowy bez funkcji, więc anonimowe funkcje w języku bez funkcji nie były naturalne. A przynajmniej miałoby to duży wpływ na projekt języka.
- Anonimowe funkcje nie były popularne w społeczności programistów, które Java miała przyciągnąć (C, C ++, Pascal?). Nawet teraz wielu programistów Java wydaje się uważać te funkcje za dość egzotyczne (ale prawdopodobnie zmieni się to bardzo szybko w przypadku Java 8).
W następnych latach, jak wyjaśnił Robert Harvey, zasadą firmy Sun było zawsze zachowanie kompatybilności wstecznej i bardzo stabilnej Java.
Z drugiej strony pojawiły się inne konkurencyjne języki (najważniejsze to C #, który urodził się jako klon Java, a następnie obrał własny kierunek rozwoju).
Konkurencyjne języki wywierają presję na Javę z dwóch powodów:
Ekspresyjna moc
Nowe funkcje mogą ułatwić pisanie niektórych idiomów programowania, czyniąc język bardziej atrakcyjnym dla programistów. Zwykle zestaw funkcji zapewnianych przez język stanowi kompromis między mocą ekspresji, złożonością języka, spójnością projektu: dodanie większej liczby funkcji sprawia, że język jest bardziej ekspresyjny, ale także bardziej złożony i trudny do opanowania.
W każdym razie w ciągu ostatnich kilku lat konkurenci Javy dodali wiele nowych funkcji, których Java nie miała, i można to uznać za zaletę.
Szum
Tak, niestety jest to czynnik decydujący o wyborze technologii, przynajmniej z tego, co widzę w moim codziennym doświadczeniu jako programisty: narzędzie musi mieć pewną funkcję, nawet jeśli większość członków zespołu nie wie, jak go używać i ci, którzy mogliby z niego korzystać, nie potrzebują go przez większość czasu.
Hype może być jeszcze ważniejszy dla osób nietechnicznych, takich jak menedżerowie, którzy mogą decydować o platformie dla określonego projektu. Menedżerowie czasami pamiętają tylko niektóre słowa kluczowe, takie jak lambda, paralelizm, wielordzeniowy, programowanie funkcjonalne, przetwarzanie w chmurze ... Jeśli nasza wybrana technologia ma zielony znak na każdej pozycji na liście, jesteśmy na bieżąco.
Więc IMO od pewnego czasu Java została złapana pomiędzy
- oryginalna polityka stabilności języka i prostoty projektowania, ogromna baza kodu i społeczność programistów z jednej strony, oraz
- presja konkurujących języków, które mogłyby przyciągnąć programistów Java, najpierw C #, a następnie Scala, Clojure, F # (wymieniam te, o których wiem, że mogą istnieć inni).
Ostatecznie Oracle zdecydowało się zaktualizować Javę, aby była bardziej konkurencyjna. Moim zdaniem nowe funkcje skierowane są w szczególności do programistów Java, którzy mogą ulec pokusie przejścia na C # i którzy postrzegają inne języki, takie jak Scala i Clojure, jako zbyt różne od Java. Z drugiej strony programiści, którzy mają pewne doświadczenie w programowaniu funkcjonalnym i nadal chcą korzystać z JVM, prawdopodobnie już przeszli na Scala, Clojure lub inny język.
Tak więc nowe funkcje Java 8 zwiększą możliwości Javy jako języka, a deklarowanym celem jest jednoczesne i równoległe programowanie, ale wydaje się, że aktualizacja dotyczy również aspektów marketingowych (Mark Reinhold, główny architekt Java w Oracle, powiedział: „Niektórzy powiedzmy, że dodanie wyrażeń Lambda ma nadążyć za fajnymi dziećmi, i jest w tym trochę prawdy, ale prawdziwym powodem są procesory wielordzeniowe; najlepszym sposobem na radzenie sobie z nimi jest Lambda ”, zobacz ten artykuł ).
Tak, wiele (wszystkie) funkcje Java 8 były już dobrze znane, ale dlaczego i kiedy funkcja jest dodawana do języka zależy od wielu czynników: grupy docelowej, istniejącej społeczności, istniejącej bazy kodu, konkurencji, marketingu itp.
EDYTOWAĆ
Krótka notatka dotycząca „... Czytałem o strumieniach w SIC (1996).”: Czy masz na myśli, że do implementacji strumieni potrzebujesz lambda Java 8? W rzeczywistości możesz je zaimplementować za pomocą anonimowych klas wewnętrznych.