拡張されたfor構文の利用
この総称型に関連して、「コレクションを繰り返しで利用するための構文」が新たに用意されることになりました。それは、forです。といっても、従来からあるforとは少しだけ違います。
class MyData {
public ArrayListlist = new ArrayList ();
public void printAll() {
for(int i = 0;i < list.size();i++){
System.out.print(list.get(i) + " ");
}
}
}
先ほどのMyDataクラスにまた登場してもらいましょう。少し処理を変更して、forを使った形にしてみました。このように、コレクションをforで利用することというのもあります。
こうしたforを利用した処理では、例えば「要素数以上の繰り返しをしようとして失敗した」なんて例外を起こしてしまうことなどもよくありますね。コレクションだけでなく、配列などでもよくあるケアレスミスでしょう。
こうした「複数の要素を持つものから、存在する要素だけをきっちり取り出して処理する」というようなとき、どうするのが確実でしょうか。先の例ではIteratorを取り出して処理していましたが、ただ「全部きれいに取り出すため」だけにIteratorをわざわざ持ち出すのは面倒ですし、配列など利用できないものもあります。もっと一般的な対処法はないでしょうか。
こうした要望にこたえて登場したのが、拡張for構文です。これは、以下のような形をしています。
for (変数 : コレクション )
このforは、コレクションや配列の中から順番に要素を取り出し、指定の変数に代入します。これを利用することで、中にある要素すべてに対してきちんと1回ずつ処理を行なうことができます。
class MyData {
public ArrayListlist = new ArrayList ();
public void printAll() {
for(String str:list){
System.out.print(str + " ");
}
}
}
これが修正したソースコードです。ずいぶんとすっきりしましたね。listの中身が順次strに収められていくので、繰り返しでは単にstrを操作するだけで済んでしまいます。いちいちgetしたりIteratorからnextする必要もなし。「コードがすっきりと見やすくなる」というのも、拡張forの利点の一つといってよいでしょう。