Когда Java была впервые разработана, считалось целесообразным исключить анонимные функции. Я могу думать о двух причинах (но они могут отличаться от официальных):
- Java была разработана как объектно-ориентированный язык без функций, поэтому было не очень естественно иметь анонимные функции в языке без функций. Или, по крайней мере, это сильно повлияло бы на дизайн языка.
- Анонимные функции не были популярны в сообществах программистов, которых Java должна была привлекать (C, C ++, Pascal?). Даже сейчас многие программисты на Java, кажется, считают эти функции довольно экзотическими (но это, вероятно, изменится очень быстро с Java 8).
В последующие годы, как объяснил Роберт Харви, политика Sun всегда заключалась в том, чтобы поддерживать Java обратно совместимым и очень стабильным.
С другой стороны, появились другие конкурирующие языки (наиболее важным из которых является C #, который родился как клон Java, а затем взял свое собственное направление развития).
Конкурирующие языки подвергли Java давлению по двум причинам:
Выразительная сила
Новые функции могут облегчить написание определенных идиом программирования, делая язык более привлекательным для программистов. Обычно набор функций, предоставляемых языком, представляет собой компромисс между выразительной силой, сложностью языка и согласованностью дизайна: добавление большего количества функций делает язык более выразительным, но также более сложным и трудным в освоении.
В любом случае, за последние несколько лет конкуренты Java добавили много новых функций, которых у Java не было, и это можно считать преимуществом.
обман
Да, к сожалению, это является фактором выбора технологии, по крайней мере из того, что я вижу в своем ежедневном опыте программиста: инструмент должен иметь определенную функцию, даже если большинство членов команды не знают, как его использовать и тем, кто сможет его использовать, большую часть времени это не нужно.
Hype может быть даже более важен для нетехнических людей, таких как менеджеры, которые могут быть теми, кто выбирает платформу для определенного проекта. Менеджеры иногда запоминают только некоторые ключевые слова, такие как лямбда, параллелизм, многоядерность, функциональное программирование, облачные вычисления ... Если у нашей технологии выбора есть зеленая отметка на каждом элементе списка, то мы в курсе.
Таким образом, IMO в течение некоторого времени Java был пойман между
- оригинальная политика языковой стабильности и простоты дизайна, огромная база кода и сообщество разработчиков с одной стороны, и
- давление конкурирующих языков, которое могло бы привлечь программистов на Java, сначала C #, а затем Scala, Clojure, F # (я называю те, которые мне известны, могут быть и другие).
В итоге Oracle решила обновить Java, чтобы сделать ее более конкурентоспособной. На мой взгляд, новые функции адресованы в особенности программистам на Java, у которых может возникнуть желание переключиться на C # и которые считают, что другие языки, такие как Scala и Clojure, слишком отличаются от Java. С другой стороны, разработчики, которые имеют некоторый опыт функционального программирования и все еще хотят использовать JVM, вероятно, уже переключились на Scala, Clojure или другой язык.
Таким образом, новые функции Java 8 сделают Java более мощной в качестве языка, и заявленное внимание уделяется параллельному и параллельному программированию, но, похоже, обновление затрагивает и маркетинговые аспекты (Марк Рейнхольд, главный архитектор Java в Oracle, сказал: «Некоторые скажем, добавление лямбда-выражений просто для того, чтобы не отставать от крутых ребят, и в этом есть доля правды, но настоящая причина - многоядерные процессоры; лучший способ справиться с ними - с помощью лямбды »(см. эту статью ).
Итак, да, многие (все) функции Java 8 уже были хорошо известны, но почему и когда функция добавляется в язык, зависит от многих факторов: целевой аудитории, существующего сообщества, существующей кодовой базы, конкурентов, маркетинга и т. Д.
РЕДАКТИРОВАТЬ
Короткая заметка, касающаяся «... я читал о потоках в SIC (1996).»: Вы имеете в виду, что вам нужны лямбды Java 8 для реализации потоков? На самом деле вы можете реализовать их, используя анонимные внутренние классы.