オーダーメイドコース
icon
icon

Javaでコールバック処理を使う方法【初心者向け】

初心者向けにJavaでコールバック処理を使う方法について解説しています。関数に引数として渡す関数のことをコールバック関数と言います。コールバック処理の構造と書き方、Javaでの注意点について見ていきましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

Javaでコールバック処理を使う方法について解説します。

実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

なお本記事は、TechAcademyのJava講座の内容をもとに作成しています。

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

コールバック処理を使う方法について詳しく説明していくね!

大石ゆかり

お願いします!

 

コールバック処理とは

コールバック関数(コールバック処理)について説明します。

コールバック関数は、「ある関数Aに引数として渡す別の関数B」のことです。

関数Aの処理の一部を任意の別の関数に任せたい場合や、イベントの発生などの任意のタイミングで実行したいひとかたまりの処理を関数としてあらかじめ登録しておくときなどに利用されます。

例えば以下のように関数Aの中で、引数で渡した関数を呼び出すような構造にしておくと、関数Aの呼び出し元が関数Bの代わりに関数Cを渡せば、処理の内容を切り替えることができます。

void 関数A(関数) {
    ....
    関数();
}

// 関数Aに、関数Bを渡して呼び出す
関数A(関数B);

// 関数Aに、関数Cを渡して呼び出す
関数A(関数C);

 

コールバックの処理を行う方法

コールバック処理をJavaで実現するには、一工夫が必要になります。なぜならJavaでは関数を引数で渡すことが言語仕様上許容されていないからです。

 

[PR] 未経験からWebエンジニアを目指す方法とは

実際に書いてみよう

例えば、Javaには「java.util.List」などのコレクションオブジェクトの要素を並び替えるためのユーティリティとして「Collections.sort( )」というAPIが標準で用意されています。

(APIの概要は左記のリンク先をご確認ください)

これを使ったコールバック処理の例を見てみましょう。

Collections.sort(companyList, new Comparator<Company>() {
    @Override
    public int compare(Company c1, Company c2) {
        return c1.getId() - c2.getId();
    }
});

第2引数の「new Comparator〜」の部分がコールバック処理です。ここでは無名クラスのインスタンスをコールバック処理として指定しています。

Java8からは、これと同じ処理をラムダ式を使ってより簡潔に書くことができます。

Collections.sort(companyList, (c1, c2) -> c.getId() - c2.getId());

さらに、「メソッド参照」という仕組みを使うと、次のようにC言語の関数ポインタと似たような形で書くこともできます。

// CompanyクラスのメソッドgetInt()の戻り値を比較するComparatorを生成
Collections.sort(companyList, Comparator.comparingInt(Company::getId));

// Companyをふたつ引数に取るstaticメソッドCallbackSample.compareCompanyをメソッド参照で渡す
Collections.sort(companyList, CallbackSample::compareCompany);


// CallbackSampleクラス内にメソッドを定義
static int compareCompany(Company c1, Company c2) {
    return c1.getId() - c2.getId();
}

もしあなたがJava8以降を使うのであれは、ラムダ式やメソッド参照を使った書き方を身につけておくとよいでしょう。

 

監修してくれたメンター

青柳哲夫

独立系SIerやベンチャーを経て、現在はフリーランスエンジニアとして活動しています。
PHPやJava・Rubyでの業務系Webアプリケーション開発が得意です。
TechAcademyではJavaコース・ブロックチェーンコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

また、オンラインのプログラミングスクールTechAcademyでは、Java講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、習得することが可能です。