[解決済み] Javaで関数をパラメータとして渡すには?[重複しています]。
2022-03-13 10:19:14
質問
Javaで、ある関数を他の関数の引数として渡すにはどうしたらよいでしょうか?
どのように解決するのですか?
Java 8 以上
Java 8+ のラムダ式を使うと、クラスやインターフェイスに抽象メソッドが1つしかない場合 (以下、「抽象メソッド」と呼ぶこともあります。 SAM型 )のようなものがあります。
public interface MyInterface {
String doSomething(int param1, String param2);
}
であれば、MyInterface が使われているところならどこでも、ラムダ式に置き換えることができる。
class MyClass {
public MyInterface myInterface = (p1, p2) -> { return p2 + p1; };
}
例えば、新しいスレッドを非常に素早く作成することができます。
new Thread(() -> someMethod()).start();
そして メソッド参照構文 を使えば、さらにすっきりします。
new Thread(this::someMethod).start();
なし ラムダ式の場合、この最後の2つの例は次のようになります。
new Thread(new Runnable() { someMethod(); }).start();
Java 8以前
一般的なパターンは、次のようなインターフェースで「ラップ」することです。
Callable
例えば、Callableを渡します。
public T myMethod(Callable<T> func) {
return func.call();
}
このパターンは コマンドパターン .
特定の用途のためにインターフェイスを作成するのが最善であることを心に留めておいてください。もしcallableを選んだのなら、上記のTをStringのような期待する戻り値の型に置き換えるでしょう。
下のコメントに対して、あなたはこう言うことができます。
public int methodToPass() {
// do something
}
public void dansMethod(int i, Callable<Integer> myFunc) {
// do something
}
を作成し、おそらく無名の内部クラスを使ってそれを呼び出します。
dansMethod(100, new Callable<Integer>() {
public Integer call() {
return methodToPass();
}
});
これは「トリック」ではないことを覚えておいてください。関数ポインタに相当するJavaの基本概念に過ぎないのです。
関連
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
最新
-
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パッケージが存在しないエラー
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】Java、"変数名 "を変数に解決することができない
-
[解決済み] 二項演算子「&」のオペランド型がおかしい java
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】Java: GZIPInputStreamの作成に失敗しました。GZIP形式ではありません
-
[解決済み】Java パラメータとしてメソッドを渡す