はじめに
この記事を読めば、Javaのcontinue文を使いこなすことができるようになります。
プログラミングでよく出会う繰り返し処理、その中でも特に「ループ」において、特定の条件に合致したときにスキップしたい――そんな要望はよくありますよね。
Javaでは、このような処理を綺麗にかつ効率的に書くために「continue文」が提供されています。
Javaにおけるcontinue文の基本的な使い方から応用例、そしてそのカスタマイズ方法まで、初心者から中級者までが理解できるように詳しく解説します。
●Javaとは
○Javaの基本概念
Javaは、1995年にサン・マイクロシステムズ(現在はオラクル社)によって開発されたプログラミング言語です。
オブジェクト指向を採用しており、一度書いたコードがさまざまなプラットフォームで動作する「Write Once, Run Anywhere」が大きな特徴です。
○Javaでよく使われる制御文
Javaでは、ループ(繰り返し処理)や条件分岐などの制御文が多く用意されています。
主なものとしては、if文、for文、while文、do-while文、switch文などがあります。
これらの制御文は、単独で使われることもありますが、組み合わせて使われることでさまざまな複雑な処理を実現します。
そして、特定の状況でループ処理をコントロールするために「continue文」や「break文」もよく用いられます。
特に今回注目するcontinue文は、特定の条件下でその後の処理をスキップし、次のループに移る役割を果たします。
●continue文の基本
Javaプログラムの中でループを使って処理を繰り返すとき、特定の条件でループ内の処理をスキップしたい場面がよく出てきます。
その際に利用されるのが「continue文」です。
○continue文とは
continue文は、ループ処理の中で使用される制御文の一つです。
この文を実行すると、ループの残りの部分をスキップして、次のループ処理に移ります。
簡単に言うと、「この回のループはここまでとして、次に進もう!」という指示を出す役割があります。
○基本的な使い方
continue文の基本的な使い方を、for文と組み合わせたサンプルコードを通して説明します。
このコードでは0から9までの数字をfor文で繰り返して出力しています。
しかし、iが偶数のときにはcontinue文が実行されるため、その後のSystem.out.println(i);
は実行されず、次のループに移ります。
このコードを実行すると、次のような出力が得られます。
このように、偶数(0, 2, 4, 6, 8)が出力されず、奇数のみが出力されているのがわかります。
continue文は、このようにループ内の特定の処理をスキップするときに非常に便利です。
ただし、乱用するとコードの可読性が下がる場合があるため、使用する際には注意が必要です。
●continue文の詳細な使い方
Javaのcontinue文は非常に便利ですが、その効果を最大限に発揮するためには、その詳細な使い方を理解することが重要です。
ここでは、continue文がどのように各種のループで使用されるのか、サンプルコードを用いて詳しく説明します。
○サンプルコード1:forループでの使用例
まず初めに、forループと一緒にcontinue文を使った基本的な例を見てみましょう。
このサンプルコードでは、0から4までの数字に対してループ処理を行います。
ループ内でiの値が2の場合は、continue文が実行され、その後のSystem.out.println("iの値は " + i);
は実行されません。
実行すると、出力結果は次のようになります。
“iの値は 2″という出力がスキップされていることが確認できます。
○サンプルコード2:whileループでの使用例
次に、whileループにおけるcontinue文の使用例を考察します。
このコードでは、iが2の時にcontinue文が実行される構造になっています。
ただし、whileループを使う場合は、iをインクリメントする操作をcontinue文の前に移動しています。
この点がforループとは異なります。実行結果は次の通りです。
こちらも”iの値は 2″という出力がスキップされています。
○サンプルコード3:do-whileループでの使用例
do-whileループもJavaプログラミングでよく使用されるループの一つです。
このループタイプでは、まずブロック内の処理が実行され、その後に条件が評価されます。
この特性を考慮しながら、do-whileループ内でcontinue文を適用してみましょう。
このコードでは、do-whileループが5回実行される予定です。
しかし、iが2になった際にcontinue文が実行されるため、その回のSystem.out.println("iの値は " + i);
はスキップされます。
ここで注意すべき点は、whileループと同様に、iをインクリメントする処理をcontinue文の前に置く必要があることです。
実行すると次の出力が得られます。
“iの値は 2″が出力されないことから、continue文が正確に働いていることがわかります。
○サンプルコード4:ネストしたループでの使用例
複数のループを組み合わせて使用する場合、通称「ネストしたループ」と呼ばれる状況が発生します。
この場合でもcontinue文はその役割を果たしますが、どのループに対して作用するのか明確に理解する必要があります。
このコードでは外側のループ(iに関するループ)と内側のループ(jに関するループ)があります。
内側のループでjが2になると、continue文によってその後の処理がスキップされます。
この場合の出力は次の通りです。
“i = 1, j = 2″、”i = 2, j = 2″、”i = 3, j = 2″といった行が出力されていないことから、continue文が内側のループに正確に作用していることが確認できます。
●continue文の応用例
この節では、continue文を更に進んだ形で使用するいくつかの例を見ていきましょう。
これまで基本的な使用方法について説明してきましたが、実際のプログラミング作業ではより複雑なケースが多くあります。
それを考慮して、より実践的な例を紹介します。
○サンプルコード5:条件に応じて処理をスキップ
最初に、複数の条件が組み合わさった状況でcontinue文を使う例を見ていきましょう。
例えば、ある数列から特定の条件に一致する数値だけをスキップしたい場合が考えられます。
このコードは0から10までの数値をループで処理しています。
iが2または3で割り切れる場合には、continue文が実行されてそれ以降の処理がスキップされます。
結果として出力される数値は、2でも3でも割り切れない数値のみになります。
このコードを実行すると、次のような出力が得られます。
○サンプルコード6:配列から特定の要素を除外
次に、配列内の要素をループで処理する際に、特定の要素だけをスキップするケースを考えてみましょう。
このコードは、1から5までの要素を持つ配列を処理しています。
要素が3の場合にcontinue文が実行され、その後の処理がスキップされます。
このコードを実行すると、次のような出力が得られます。
この例では、要素が3の場合にcontinue文により処理がスキップされているため、その数値が出力から除外されています。
○サンプルコード7:複数の条件でスキップ
プログラミングにおいては、一つ以上の条件に合致する場合に処理をスキップしたいというシチュエーションもよくあります。
下記のサンプルコードでは、そのような場合にどのようにcontinue文を使えるかを表します。
このサンプルコードでは、1から20までの数値について、各数値が偶数(2で割り切れる)または5で割り切れる場合に処理をスキップしています。
if文内での論理演算子||
(OR演算子)を使って複数の条件を組み合わせています。
このプログラムを実行すると、次のような出力が得られます。
この結果からも分かるように、数値が偶数または5で割り切れる場合には出力されていません。
○サンプルコード8:continue文とbreak文の併用
continue文だけでなく、break文もループ制御でよく用いられます。
この2つをうまく組み合わせることで、更に高度な制御が可能になります。
このコードは、1から10までの数値を順番に処理しています。
iが偶数であればcontinue文によって処理がスキップされ、iが5になったらbreak文によってループが終了します。
実行すると次のような出力が得られます。
この場合、iが偶数である場合はcontinue文によってスキップされ、さらにiが5に達したときには、break文が実行されてループ自体が終了しています。
●continue文のより高度な応用例
Javaのcontinue文は基本的なループ制御から高度な応用まで、多くの場面で役立つ制御文です。
ここでは、より専門的なケースに対応できるような、高度な使い方をいくつか紹介します。
○サンプルコード9:ラベルを使用した例
Javaでは、ラベルとcontinue文を組み合わせて、多重ループでも特定のループに対してcontinue文を適用することができます。
このコードでは、外側のループにouter
というラベルを付け、内側のループでcontinue文を用いる際にこのラベルを指定しています。
これにより、j == 2
になった時点で外側のループに対してcontinueが適用されます。
実行してみると、出力は次のようになります。
jが2になった瞬間に、外側のループが次のイテレーションに移っていることがわかります。
○サンプルコード10:continue文でリファクタリング
コードの可読性やメンテナンス性を高めるために、continue文はリファクタリングにも役立ちます。
例えば、次のようにネストが深いif文を見てみましょう。
このコードでは偶数かつ4でも8でもない数を出力していますが、ネストが深くて少し読みにくいです。
ここでcontinue文を使ってリファクタリングすると次のようになります。
continue文を使うことで、コードがスッキリとして可読性が高まります。
このケースでの実行結果は、どちらのコードも以下のような出力をします。
○サンプルコード11:ストリーム処理での使用例
Java8以降、ストリームAPIを使うことで、データの変換や処理をより効率的に行うことができます。
continue文自体はストリーム処理で直接使用することはありませんが、ストリームAPIで条件によって処理をスキップするような動きを模倣することはできます。
ここでは、ストリーム処理で条件に基づいて要素をスキップする方法について解説します。
このコードでは、filter
メソッドを用いて、特定の条件にマッチする要素だけを新しいリストにしています。
特に、偶数と8以上の数はこのリストから除外されています。
こうした動きは、ループとcontinue文を使っても実現できますが、ストリームAPIを用いると、このように簡潔に記述できる利点があります。
このプログラムを実行すると、次の出力が得られます。
この出力から、偶数や8以上の数がうまく除外され、条件に一致する奇数だけが新しいリストに含まれていることが確認できます。
○サンプルコード12:エラーハンドリングとの組み合わせ
continue文はエラーハンドリングと組み合わせて使うことができます。
エラーが発生した場合にそのイテレーションをスキップするサンプルコードを紹介します。
このサンプルでは、i
が2のときに例外を投げています。
catchブロックで例外を捕まえて、その後でcontinue文を用いて次のループへと移行しています。
このコードを実行すると、出力は次のようになります。
ここで、i == 2
のときはエラーが発生しているため、「処理を実行: 2」という出力はスキップされ、次のループに移っています。
●注意点と対処法
continue文は繰り返し処理の流れを制御する強力なツールですが、適切に使用しないと、コードの可読性やパフォーマンスに影響を与える可能性があります。
ここでは、そのような注意点とそれに対する対処法を解説します。
○continue文の誤用
初心者が犯しやすいミスの一つは、continue文を過度に使用することです。
この誤用はコードの可読性を低下させる可能性があります。
たとえば、次のようなコードが考えられます。
上記のコードでは、偶数または3であればそのイテレーションをスキップします。
このような場合、continue文を複数使うよりも、条件を一つにまとめることで、より読みやすいコードになります。
この修正後のコードを実行すると、出力は「1, 5, 7, 9」となり、偶数および3が除外された結果が得られます。
○パフォーマンスへの影響
continue文自体はコンパイラが最適化を行うため、パフォーマンスへの影響はほとんどありません。
しかし、不必要な条件分岐が多くなると、それが累積してパフォーマンスに影響を与える可能性があります。
例えば、以下のようなネストされたループでは、continue文が内部ループで使われている場合、外部ループが多くのイテレーションを行うとパフォーマンスが低下する可能性があります。
○可読性とメンテナンス
過度な使用や誤用が続くと、continue文はコードの可読性を低下させ、メンテナンスが困難になる可能性があります。
そのため、コメントを活用して、何のためにcontinue文を使っているのかを明示することが重要です。
このサンプルコードを実行すると、出力は「1, 3, 5, 7, 9」になります。
●カスタマイズ方法
Javaのcontinue文はその基本機能だけでなく、さまざまな応用が可能です。
ここでは、カスタムライブラリでの使用や拡張forループ、ラムダ式との組み合わせなど、高度なカスタマイズ方法を紹介します。
○サンプルコード13:カスタムライブラリでの使用
Javaには多くのライブラリが存在しますが、独自のライブラリを作成して、そこでcontinue文を使用することもあります。
例として、整数のリストから特定の値をフィルタリングするライブラリを考えましょう。
このコードでは、CustomFilter
クラス内でfilterOut
メソッドを定義しています。
このメソッドは、整数のリストとフィルタリング対象となる整数を受け取り、その整数を除いた新しいリストを生成して返します。
continue文がこのフィルタリングを効率的に行っています。
このコードを使用すると、次のような結果が得られます。
○サンプルコード14:拡張forループとの組み合わせ
拡張forループ(foreachループ)とcontinue文を組み合わせることで、コードを更に簡潔にすることができます。
このコードでは、配列numbers
から要素を一つずつ取り出し、その要素が偶数であればスキップします。出力は「1, 3, 5」となり、偶数が正確に除外されています。
○サンプルコード15:ラムダ式との組み合わせ
Java 8以降、ラムダ式とStream APIを用いて、高度なデータ操作が可能になりました。
continue文とは直接関係ありませんが、同様の処理をStreamで実装する方法もあります。
このコードでは、ラムダ式とStream APIを使用して、リスト内の偶数をフィルタリングしています。
出力は「1, 3, 5」となり、偶数が除外された新しいリストが生成されます。
まとめ
本記事では、Javaのcontinue文の多角的な側面について詳細に探究してきました。
初心者が知るべき基本的な使い方から、中級者や上級者が取り組むような応用例、そしてそれに続く注意点と対処法、さらにはカスタマイズ方法までを網羅しました。
その効果を最大限に活用するには、その基本性質を理解するだけでなく、さまざまな応用可能な局面を知ることが重要です。
この記事が、continue文というJavaの基本的な制御文に新たな視点をもたらし、より高度なプログラミングへの道を拓く一助となれば幸いです。