- teamA と teamB はどこに入力されますか? それともそうではありませんか(ジェネリックの奇妙な形のように)?
Lambda は、ジェネリック メソッド呼び出し (1.5 以降) やダイヤモンド [not an] 演算子 (1.7 以降) によく似たターゲット型付けを使用します。大まかに言えば、結果が適用される型が記述されている (または推測できる) 場所は、Single Abstract Method (SAM) の基本型の型、つまりメソッド パラメーターの型を提供するために使用されます。
1.5 での一般的なメソッドの推論の例として:
Set<Team> noTeams = Collections.emptySet();
1.7 のダイヤモンド演算子:
Set<Team> aTeams = new HashSet<>();
チーム、チーム、チーム、チーム、チーム、チーム。チームという言葉を言うのも大好きです。
- ラムダはクロージャーの一種ですか、それともその逆ですか?
ラムダは、匿名の内部クラスとほぼ同じ方法でクロージャーの制限された形式ですが、いくつかのランダムな違いがあります。
アウターthis
はインナーに隠れませんthis
。これは、ラムダと匿名の内部クラスの同じテキストが、微妙に、しかし完全に異なることを意味する可能性があることを意味します。これにより、スタック オーバーフローは奇妙な質問で忙しくなります。
inner の不足を補うためthis
に、ローカル変数に直接割り当てられた場合、その値はラムダ内でアクセスできます。IIRC(確認できましたが、しません)、匿名の内部クラスでは、ローカルはスコープ内にあり、外部スコープの変数を非表示にしますが、使用できません。インスタンス初期化子がないため、これを指定するのがはるかに簡単になると思います。
たまたまマークされていないが、マークされfinal
ている可能性があるローカル フィールドは、あたかも であるかのように扱われますfinal
。したがって、スコープ内にはありませんが、実際に読み取ることはできます (書き込むことはできません)。
- これにより、典型的な匿名関数よりもどのような利点が得られますか?
より簡潔な構文。それはそれについてです。
もちろん、Java 構文の残りの部分は、これまでと同じようにどうしようもなく悪いものです。
これが初期実装にあるとは思いませんが、[内部] クラスとして実装される代わりに、ラムダはメソッド ハンドルを使用できます。メソッド ハンドルのパフォーマンスは、以前の予測をやや下回っています。クラスを廃止すると、バイトコードのフットプリント、おそらく実行時のフットプリント、そして確実にクラスの読み込み時間が削減されます。ほとんどの匿名内部クラス (Serializable
自明な静的イニシャライザーではない) が、特に顕著な非互換性なしに、よく考えられていないクラス ローディング メカニズムを通過しない実装が存在する可能性があります。
(隠蔽に関する用語が正しいことを願っています。)