見出し画像

【Android】Java・Kotlinでコールバック関数を引数として渡す方法

特にAndroid開発でのお話です。

  • Javaでコールバック関数を引数に渡す

  • Kotlinでコールバック関数を引数に渡す

あるメソッドに対してコールバック関数を渡し、
処理が終わったらそれを実行させたいという目的。

その方法とかコード例をまとめました。

コールバックを引数に渡すことが求められる場面

メソッドの引数にコールバック関数を渡す場面

多くはないけど必要になるシーンはあります。

▼ 例えばこのようなケース

  • 内部で非同期的な処理をするメソッド

  • その結果はメソッド終了時に分からない

  • だからコールバック渡しが役に立つ

▼ 疑似的なコード

function hogehoge(x, callback){
    /// 非同期な処理スタート
    [非同期な処理] {
        /// なんか時間がかかる処理
        x = takeMuchTime(x)
        
        /// 終わったらコールバック実行
        callback(x)
    }
}

※ 上記のは飽くまで疑似的なコードです

このような非同期処理をメソッド内で行ってる場合、結果が返ってくるのを待つ代わりにコールバック関数を渡すこともあります。

そういう方法についてです。

Kotlinでコールバック関数を渡す方法/コード例

初めにKotlinでのコールバック関数の引数渡し

Kotlinでは関数の引数渡しはあまり難しくありません。

▼ とても簡単なKotlinコード例

private fun hogehoge(x: Int, callback: (x: Int) -> Unit){
    val thread = Thread{
        /// 実行に時間がかかる処理
        x = takeMuchTime(x)
        
        /// コールバックを実行
        callback(x)
    }
    thread.run()
}

このように (x: Int) -> Unit のようなラムダ式を渡すだけです。この例だとInt型の引数を取って返り値なしのコールバックという意味ですね。

あとはメソッド内でそれを実行するだけ

Javaでの関数コールバックを引数渡しする方法

Javaでは関数渡しに色々方法があります。

  • Runnableを渡して実行させる

  • interfaceを定義して渡す

  • Consumerオブジェクトを渡す

  • ラムダ式を使う(java8以降)

ググるとinterfaceを定義してコールバックを渡してたり、あるいはRunnbaleを渡してメソッド内で callback.run() などの記事がヒットします。

でもコールバックを引数渡しするには面倒すぎるし、Runnableなどでは引数も指定できないからあまりいい方法ではありませんでした。

まだマシだと思うのはConsumerを使う方法です。

import java.util.function.*;

...

private void hogehoge(int x, Consumer<Integer> callback) {
    Thread thread = new Thread(){
        @Override 
        public void run(){
            int rst = x*x;
            callback.accept(rst);
        }
    };
    thread.run();
}

private void main(){
    hogehoge(100, (result) -> {
        System.out.println("result :" + result);
    });
}

もしJava8未満ならこの方法がベストかもしれない

Java8ならラムダ式を使うのが絶対的に楽ですね (-_-;)

この記事が気に入ったらサポートをしてみませんか?