[解決済み] Javaで関数をパラメータとして渡すには?[重複]する
2022-02-18 13:31:13
質問
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 JDK - doubleからintへの非可逆変換の可能性
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み] JavaでSSLピアが正しくシャットダウンされない
-
[解決済み] この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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み】このコンパイルユニットは名前付きモジュールに関連しているため、名前付きパッケージeclipseを宣言する必要があります。
-
[解決済み】エラー。Selection does not contain a main type
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み] StringBuilderをクリアまたは空にするにはどうすればよいですか?重複] [重複] [重複] [重複] [重複] [重複
-
[解決済み】javaで無効な文字定数
-
[解決済み】CreateProcess error=2, The system cannot find file specified.
-
[解決済み】Java パラメータとしてメソッドを渡す