SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
RxJavaによるリアクティブプログラミング入門

リアクティブプログラミングとRxJavaの概要

RxJavaによるリアクティブプログラミング入門(1)

  • X ポスト
  • このエントリーをはてなブックマークに追加

 この連載では、Javaでリアクティブプログラミングを行うためのライブラリである「RxJava」を使って、リアクティブプログラミングにおけるポイントや、RxJavaが持つ機能について学んでいきます。今回は、RxJavaおよびリアクティブプログラミングの概要について解説します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

対象読者

  • Java経験者(初心者可)
  • RxJava未経験者
  • リアクティブプログラミング未経験者

RxJavaとは

 RxJavaは、Javaでリアクティブプログラミングを行うためのライブラリです。このライブラリは軽量であり、また、他のライブラリに対する依存がないのでRxJavaのjarをパスに通すだけで使えるようになります。対応しているJavaのバージョンは6からで、さらにAndroidもバージョン2.3(Gingerbread)からサポートしています。

 そして、RxJavaは厳密には関数型リアクティブプログラミング(Functional Reactive Programming)ではないのですが、引数に関数型インターフェースを受け取るメソッドを使っているので、関数型プログラミングのように関数を組み合わせていくことで、データの変換やフィルタなどを柔軟に組み立てれるようになっています。

リアクティブプログラミングとは

 リアクティブプログラミングとは、データが流れるように来ること(ストリーム)に着目し、データを受け取るたびに関連したプログラムが反応(リアクション)して処理を行うようにするプログラミングの考え方です。

 このデータのストリームとは、例えばGPSを利用して位置情報が変わるたびに送信されるデータの流れをイメージしてもらうと分かりやすいかもしれません。移動し位置情報が変わるたびにデータが送信され、立ち止まればデータの送信が止まるように、生成されるデータをすべてまとめて送信するのではなく、個々のデータが生成される度に順に送信していきます。このようなデータの流れのことをデータストリームと言います。

 このデータストリームはイベントとも関連していて、文字列を入力するという行為は、入力したデータが順に生成されているとみることができます。例えば「abc」という入力は、入力のイベントが発生するたびに

  1. 「a」
  2. 「ab」
  3. 「abc」

と、データが発生していると見なすことができます。同様にボタンを押す行為に関しても、具体的なデータがなくても「ボタンを押した」というデータが生成されていると見なすことが可能です。ボタンを複数回押した場合、その押した数だけ「ボタンを押した」というデータが生成されていることになります。つまりイベントも、発生するたびにデータを発信するデータストリームとして扱うことが可能になります。

 リアクティブプログラミングでは、このようなデータストリームから流れてくるデータに対し、そのデータを受け取ったプログラムが、そのたびに処理をしていく作りになっています。つまり、プログラムが必要なデータを自分から取得し処理をするのではなく、送られてきたデータを受け取るたびに反応して処理をする(リアクティブな処理をする)ようなプログラムにすることがリアクティブプログラミングになります。

 例えば、商品価格と税率から税額を計算するプログラムがあったとします。リアクティブプログラミングでない場合、商品価格と税率の値を取得しただけでは何も起こりません。値を取得した後に「税額の計算処理を行う」というアクションが実行されて初めて税額が算出されます。そして、税額を計算した後に商品価格の値が変わったとしても、再び計算処理のアクションが実行されない限り税額の値は変わりません。

リアクティブプログラミングではない場合
リアクティブプログラミングではない場合

 しかし、これがリアクティブプログラミングの場合、商品価格の値が変化するたびに税額が計算され表示されるようになります。これは商品価格の値が変化するたびに税額を計算するプログラムに値が送信され、プログラムが値を受け取ると税額の計算処理を行い、その計算結果が税額に反映されるためです。そのため、商品価格の値が変わるたびに商品価格が通知され、税額が自動的に算出されるようになります。

リアクティブプログラミングの場合
リアクティブプログラミングの場合

 これだけだと、商品価格にListenerをつけて自動で計算できるようにしたプログラムとどう違うのか疑問に思われるかもしれません。この場合、リアクティブプログラミングなのかどうかは、何が処理を行うのかの意識の違いになるかと考えられます。例えば、商品価格が変更されListenerが反応して、商品価格が税額を計算して値を反映しているという意識の場合は、リアクティブプログラミングの考え方にはなりません。

意識の違い:リアクティブプログラミングではない場合
意識の違い:リアクティブプログラミングではない場合

 これをListenerが反応したことによって、税額に新たな商品価格が渡され、税額にて計算のプログラムが実行されて、その結果を税額自身に反映していると意識している場合は、リアクティブプログラミングの考え方になります。

意識の違い:リアクティブプログラミングの場合
意識の違い:リアクティブプログラミングの場合

 そのため、今回のような簡単なプログラムの場合は、前者も後者もソースコード上ではまったく同じになる可能性はあります。しかし、このプログラミング上の考え方の違いによって、どのプログラムが何をするのかの範囲が変わってきます。行うべき処理が複雑になってきたり、商品価格の変更によって値が変わる項目が増えてきたりするにつれ、どこで処理を行うのかの比重が変わり、ソースコード上にも違いが現れてくるでしょう。

 リアクティブプログラミングでは、データの生産側(今回の例では商品価格)はデータを渡すところまでが自身の責任になります。そのため、データの生産側はデータの消費側(今回の例では税額)の処理についてはそのデータを使って何をしているのかを意識しなくてもよくなります。そしてそのことは、データの生産側は消費側で何をしているのかは関係がなくなり、消費側の処理を待つ必要もなくなるので、データの通知をした後に、消費側の処理が途中であっても、すぐに生産側の次の処理を行えます。こうすることで非同期処理を容易に実現できるようになります。

 また、システムの構築という点で見ても、リアクティブプログラミングの考え方はマイクロサービスなどの分散システムで稼働するプログラムにも向いており、現在大きな注目を浴びているプログラミング手法の一つになっています。

 ただし、紛らわしいことに、「リアクティブシステム」と言った場合、「リアクティブプログラミングで実装されたシステム」のことを表さないことに注意しないといけません。リアクティブシステムとは、簡単に説明すると、メッセージを送ることで処理を行い、状況に応じてスケールアウトやスケールインが自動で行われ、障害の耐性を高めることによって、常に迅速な応答を得ることができるシステムのことを言います。そのため、このリアクティブシステムはプログラムだけではなくインフラの条件も必要となります。そして各サービスに対しては別にリアクティブプログラミングで実装していなくても、リアクティブシステムの構築は可能でもあります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
RxJavaの概要

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
RxJavaによるリアクティブプログラミング入門連載記事一覧

もっと読む

この記事の著者

須田 智之(スダ トモユキ)

十数年間おもにSI企業にシステムエンジニアとして携わり、現在はフリーランスに。企業向けのシステム開発のかたわら個人でのモバイルアプリの開発やIT分野の記事も執筆。RxJava 2.0に対応した著書『RxJavaリアクティブプログラミング』が2017年2月16日より発売中。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9570 2016/09/01 14:00
" ); }

おすすめ

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開
  4. 4
    大企業を芯からアジャイルに──20年以上アジャイル実践してきた市谷氏が語る変革への道
  5. 5
    Node.js v23.6.0 リリース、TypeScriptの実行が容易に
  1. 6
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 7
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット
  3. 8
    「CUDA」 ~マンガでプログラミング用語解説
  4. 9
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  5. 10
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開
  4. 4
    大企業を芯からアジャイルに──20年以上アジャイル実践してきた市谷氏が語る変革への道
  5. 5
    Node.js v23.6.0 リリース、TypeScriptの実行が容易に
  6. 6
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  7. 7
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット
  8. 8
    「CUDA」 ~マンガでプログラミング用語解説
  9. 9
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  10. 10
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  1. 1
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  4. 4
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  5. 5
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  6. 6
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  7. 7
    Google、社内AIエージェント「Google Agentspace」発表
  8. 8
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開
  4. 4
    大企業を芯からアジャイルに──20年以上アジャイル実践してきた市谷氏が語る変革への道
  5. 5
    Node.js v23.6.0 リリース、TypeScriptの実行が容易に
  1. 6
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 7
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット
  3. 8
    「CUDA」 ~マンガでプログラミング用語解説
  4. 9
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  5. 10
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開
  4. 4
    大企業を芯からアジャイルに──20年以上アジャイル実践してきた市谷氏が語る変革への道
  5. 5
    Node.js v23.6.0 リリース、TypeScriptの実行が容易に
  6. 6
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  7. 7
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット
  8. 8
    「CUDA」 ~マンガでプログラミング用語解説
  9. 9
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  10. 10
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  1. 1
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  2. 2
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  3. 3
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  4. 4
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  5. 5
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  6. 6
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  7. 7
    Google、社内AIエージェント「Google Agentspace」発表
  8. 8
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  9. 9
    「CUDA」 ~マンガでプログラミング用語解説
  10. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!