3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaで関数を変数や引数に入れる

Last updated at Posted at 2023-05-29

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
 ・採用ブログ

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?