[解決済み] :: (ダブルコロン) 演算子 in Java 8
質問
を探っていました。 Java 8 のソースで、このコードの特定の部分が非常に驚くべきものであることを発見しました。
//defined in IntPipeline.java
@Override
public final OptionalInt reduce(IntBinaryOperator op) {
return evaluate(ReduceOps.makeInt(op));
}
@Override
public final OptionalInt max() {
return reduce(Math::max); //this is the gotcha line
}
//defined in Math.java
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
は
Math::max
メソッドポインタのようなものでしょうか?
通常の
static
メソッドに変換されます。
IntBinaryOperator
?
解決方法は?
通常であれば
reduce
メソッドを使用しています。
Math.max(int, int)
を以下のように設定します。
reduce(new IntBinaryOperator() {
int applyAsInt(int left, int right) {
return Math.max(left, right);
}
});
を呼び出すだけで、多くの構文が必要になります。
Math.max
. そこで登場するのがラムダ式です。Java 8以降では、同じことをもっと短い方法で行うことができるようになりました。
reduce((int left, int right) -> Math.max(left, right));
これはどのように機能するのでしょうか?Javaコンパイラは、あなたが2つの
int
を返し、1つの
int
. これは、インターフェイスの唯一無二のメソッドの正式なパラメータと同等です
IntBinaryOperator
(メソッドのパラメータ
reduce
を呼び出したい)。つまり、コンパイラはあなたのために残りを行います。
IntBinaryOperator
.
しかし
Math.max(int, int)
の形式的な要件を満たしています。
IntBinaryOperator
であれば、直接使用することができます。Java 7には、メソッド自体を引数として渡すことができる構文がないため(メソッドの結果のみを渡すことができ、メソッドの参照は決して渡すことができません)、メソッドを直接使用することはできません。
::
の構文は、メソッドを参照するためにJava 8で導入されました。
reduce(Math::max);
これは、実行時にJVMが解釈するのではなく、コンパイラが解釈することに注意してください! 3つのコード・スニペットすべてについて異なるバイトコードを生成しますが、意味的には等しいので、最後の2つは、短い(そしておそらくより効率的な)バージョンの
IntBinaryOperator
を実装しました。
(参照 ラムダ式の翻訳 )
関連
-
エラー java.util.NoSuchElementException
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Java Exceptionが発生しました エラー解決
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
SpringBootApplication を型解決できない。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
JQuery DataTable 详解
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1