Javaが最初に設計されたとき、匿名関数を除外することが適切であると考えられていました。私は2つの理由を考えることができます(ただし、公式の理由とは異なる場合があります)。
- Javaは関数のないオブジェクト指向言語として設計されたため、関数のない言語で匿名関数を使用することはあまり自然ではありませんでした。または、少なくとも、これは言語の設計に大きな影響を与えたでしょう。
- 匿名関数は、Javaが引き付けるつもりだったプログラマーコミュニティ(C、C ++、Pascal?)では人気がありませんでした。今でも、多くのJavaプログラマーはこれらの機能を非常にエキゾチックだと考えているようです(しかし、これはおそらくJava 8で非常に急速に変わるでしょう)。
その後の数年間、Robert Harveyが説明したように、Sunのポリシーは常にJavaの下位互換性と非常に安定した状態を維持することでした。
一方、他の競合する言語が登場しました(最も重要なのはC#です。これはJavaクローンとして生まれ、独自の開発の方向性を示しました)。
競合する言語は、次の2つの理由でJavaに圧力をかけています。
表現力
新機能により、特定のプログラミングイディオムを簡単に記述できるようになり、プログラマにとって魅力的な言語になります。通常、言語によって提供される機能のセットは、表現力、言語の複雑さ、設計の一貫性の間の妥協です。機能を追加すると、言語の表現力が向上しますが、習得がより複雑で困難になります。
とにかく、ここ数年、Javaの競合他社はJavaにはなかった多くの新機能を追加しましたが、これは利点と見なすことができます。
誇大広告
はい、残念ながら、これは少なくともプログラマーとしての日々の経験で見ることができることから、テクノロジーの選択における要因です:チームのほとんどのメンバーがその使用方法を知らなくても、ツールには特定の機能が必要ですそれを使用できる人はほとんどの場合それを必要としません。
誇大広告は、特定のプロジェクトのプラットフォームを決定するマネージャーなど、技術者以外の人々にとってさらに重要になる可能性があります。マネージャーは、ラムダ、並列処理、マルチコア、関数型プログラミング、クラウドコンピューティングなどの一部のキーワードしか覚えていない場合があります...選択したテクノロジにリストの各項目に緑色のマークが付いている場合、最新の状態です。
したがって、しばらくの間IMOはJavaを
- 言語の安定性とデザインのシンプルさの元のポリシー、一方では巨大なコードベースと開発者コミュニティ、そして
- 最初にJavaプログラマー、C#、次にScala、Clojure、F#を引き付ける可能性のある競合する言語のプレッシャー(私が知っているものには名前を付けますが、他にもあるかもしれません)。
最終的に、OracleはJavaをアップグレードして競争力を高めることを決定しました。私の意見では、新機能は、C#に切り替えたくなる可能性があり、ScalaやClojureなどの他の言語がJavaとあまりにも異なると考えるJavaプログラマーを特に対象としています。一方、関数型プログラミングの経験があり、それでもJVMを使用したい開発者は、おそらくすでにScala、Clojure、または別の言語に切り替えています。
したがって、新しいJava 8機能は言語としてJavaをより強力にし、宣言された焦点は並行および並列プログラミングですが、アップグレードはマーケティングの側面にも対応しているようです(OracleのJavaのチーフアーキテクトであるMark Reinholdは次のように述べています:ラムダ式を追加するだけでクールな子供たちに追いつくために、そこにいくつかの真実が、その中だが、本当の理由は、マルチコアプロセッサであると言う、それらを処理するための最良の方法は、「ラムダであり、参照この記事を)。
つまり、はい、多くの(すべての)Java 8機能はすでによく知られていますが、機能が言語に追加される理由と時期は、対象読者、既存のコミュニティ、既存のコードベース、競合他社、マーケティングなど、多くの要因に依存します。
編集
「SICのストリームについて読みました(1996)」に関する短いメモ:ストリームを実装するためにJava 8ラムダが必要であることを意味しますか?実際には、匿名の内部クラスを使用してそれらを実装できます。