ラムダ式を使用します:
輸入java.util.function.Function。
クラステスト{
公共の静的な無効メイン(文字列...引数){
機能<整数、整数>増加= E - > E + 7; //ラムダ式
System.out.println(increase.getClass())。
funcPlus(3、増加)。
}
パブリック静的ボイドfuncPlus(int値、機能<整数、整数> FUNC){
System.out.println(func.apply(値))。
}
}
出力:
クラスcom.classTest.Test $$ラムダ$ 1 / 0x0000000801200840
10
(1)適用()関数は、最新バージョンのみ1.8 Javaでサポートされています
java.util.function
インタフェース機能<T、R>
型パラメータ:
T - 関数への入力の種類
R - 関数の結果のタイプ
既知のサブインタフェースの一覧:
UnaryOperator <T>
機能インタフェース:
これは、機能インタフェースであり、したがって、ラムダ式またはメソッド参照の割り当て対象として使用することができます。
@FunctionalInterface
パブリックインターフェイス機能<T、R>
一つの引数を受け入れ、結果を生成する機能を表します。
これは、その機能的な方法である適用(オブジェクト)機能インタフェースです。
導入されたバージョン:
1.8
呼び出し可能な方法を使用します:
輸入java.util.concurrent.Callable;
パブリッククラスCallableUse {
公共の静的な無効メイン(文字列...引数){
//最終int型のNUM = 100770; 若しくは
int型NUM = 100770;
//あなたが最終的にパラメータを渡す必要がある場合は、変数を変換する必要があり、匿名内部クラスを使用します。
{試します
callMethod(100、新しい呼び出し可能<整数>(){
公共の整数コール(){
リターンneedOperation(NUM);
}
});
}キャッチ(例外E1){
// TODO自動生成されたcatchブロック
e1.printStackTrace();
}
}
パブリックstatic int型needOperation(INT PARAM){
//何かをします
PARAM = 999;
PARAMを返します。
}
公共の静的な無効callMethod(int型I、呼び出し可能<整数> myFuncという){
//何かをします
{試します
System.out.println(myFunc.call())。
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果:
999
附:
同时在这篇帖子上有人采用Java反射机制:
https://stackoverflow.com/questions/4685563/how-to-pass-a-function-as-a-parameter-in-java
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws Exception{
Class[] parameterTypes = new Class[1];
parameterTypes[0] = String.class;
Method method1 = Demo.class.getMethod("method1", parameterTypes);
Demo demo = new Demo();
demo.method2(demo, method1, "Hello World");
}
public void method1(String message) {
System.out.println(message);
}
public void method2(Object object, Method method, String message) throws Exception {
Object[] parameters = new Object[1];
parameters[0] = message;
method.invoke(object, parameters);
}
}
参考资料:
https://techndeck.com/how-to-pass-function-as-a-parameter-in-a-method-in-java-8/