Javaで関数を変数や引数に入れる
Javaでコーディングしているとき、関数そのものを変数や引数に入れたいときがあります。インターネットで情報を探すと、ConsumerやFunctionの解説がたくさん見つかります。ですが、コーディングしている最中にもっとも欲しいものは何でしょう。私は、下記のようなコピペしたらすぐに動くコード片が欲しいです。特に、戻り値の有無、引数の有無で細かいコンパイルエラーに悩まされるのは避けたいところです。なので、関数を変数や引数に入れるとき、関数の戻り値の有無、引数の有無の4通りのバリエーションのコード片を書き留めておきたいと思います。
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
public class Main {
public static void main(String[] args) throws Exception {
/* error: non-static variable this cannot be referenced from a static context
とか言われないようにMainコンストラクタの中に書きたいことを書く */
new Main();
}
public Main(){
Job j = new Job(
(Void) -> { func1();}, /* 戻り値なし、引数なし */
(Void) -> { return func2();}, /* 戻り値あり、引数なし */
(param) -> { func3(param);}, /* 戻り値なし、引数あり */
(param) -> { return func4(param);} /* 戻り値あり、引数あり */
);
j.execFunc1();
j.execFunc2();
j.execFunc3();
j.execFunc4();
}
/* 戻り値なし、引数なし */
public void func1(){
System.out.println("void, void");
}
/* 戻り値あり、引数なし */
public Integer func2(){
System.out.println("return, void");
return 1;
}
/* 戻り値なし、引数あり */
public void func3(Integer i){
System.out.println("void, arg" + i);
}
/* 戻り値あり、引数あり */
public Integer func4(String i){
System.out.println("return, arg" + i);
return 1;
}
public class Job {
private Consumer<Void> func1; /* 戻り値なし、引数なし */
private Function<Void, Integer> func2; /* 戻り値あり、引数なし */
private Consumer<Integer> func3; /* 戻り値なし、引数あり */
private Function<String, Integer> func4; /* 戻り値あり、引数あり */
public Job(Consumer<Void> func1,
Function<Void, Integer> func2,
Consumer<Integer> func3,
Function<String, Integer> func4
){
this.func1 = func1;
this.func2 = func2;
this.func3 = func3;
this.func4 = func4;
}
public void execFunc1(){
this.func1.accept(null);
}
public Integer execFunc2(){
return this.func2.apply(null);
}
public void execFunc3(){
this.func3.accept(1);
}
public Integer execFunc4(){
return this.func4.apply("hoge");
}
}
}
■株式会社ディマージシェアの情報はこちらから
・Organization
・会社HP
・採用ブログ