[解決済み】Java 8ストリームの.min()と.max():なぜこれがコンパイルされるのでしょうか?
質問
注:この質問は、以前のSOの質問であったデッドリンクに由来するものですが、ここでは...
このコードを見てください (
注:このコードが動作しないことは承知しています。
Integer::compare
を使用する必要があります。
):
final ArrayList <Integer> list
= IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());
System.out.println(list.stream().max(Integer::max).get());
System.out.println(list.stream().min(Integer::min).get());
のjavadocによると
.min()
と
.max()
であるべきであり,両者の引数は
Comparator
. しかし、ここでは、メソッドの参照先が
Integer
クラスがあります。
では、なぜこれが全くコンパイルされないのでしょうか?
どうすれば解決するの?
ここで何が起こっているのか、説明しましょう。
まず
Stream.max()
のインスタンスを受け取ります。
Comparator
のように、ストリーム内のアイテムを互いに比較して最小値や最大値を見つけることができます。
そこで問題は、当然ながら、なぜ
Integer::max
を受け入れるか? 結局のところ、それは比較対象ではないのです。
その答えは、Java 8の新しいラムダ機能の動作にあります。 これは、非公式に単一抽象メソッドインターフェース(SAMインターフェース)と呼ばれる概念に依存しています。 この考え方は、1つの抽象メソッドを持つインターフェースは、そのインターフェースの1つのメソッドに一致するメソッドシグネチャを持つラムダ(またはメソッド参照)によって自動的に実装することができるというものです。 つまり
Comparator
インタフェース(簡易版)です。
public Comparator<T> {
T compare(T o1, T o2);
}
もし、あるメソッドが
Comparator<Integer>
ということは、本質的にこのシグネチャを探していることになります。
int xxx(Integer o1, Integer o2);
私は "xxx" を使っています。 メソッド名はマッチングに使用されないため .
したがって、両方の
Integer.min(int a, int b)
と
Integer.max(int a, int b)
は十分に近いので、オートボックスによって、これが
Comparator<Integer>
をメソッドコンテキストに追加します。
関連
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] JDBC タイプの方言マッピングがありません。1111
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません