Javaにおけるリストの反復処理方法
Javaでは、リスト(List)内の要素を反復処理するためのさまざまな方法があります。以下では、代表的な手法について説明します。
forループ
最も基本的な方法です。リストのサイズを取得し、インデックスを使って各要素にアクセスします。
List<String> myList = Arrays.asList("apple", "banana", "orange");
for (int i = 0; i < myList.size(); i++) {
String element = myList.get(i);
// 要素の処理
}
Java 5から導入された簡潔な構文です。リストの要素を直接変数に代入して処理します。
List<String> myList = Arrays.asList("apple", "banana", "orange");
for (String element : myList) {
// 要素の処理
}
Iterator
リストの要素を順次取得するためのイテレータを使用します。hasNext()
で次の要素があるかどうかを確認し、next()
で取得します。
List<String> myList = Arrays.asList("apple", "banana", "orange");
Iterator<String> iterator = myList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
// 要素の処理
}
ListIterator
Iterator
の拡張で、双方向の反復処理や要素の削除などが可能です。
List<String> myList = Arrays.asList("apple", "banana", "orange");
ListIterator<String> iterator = myList.listIterator();
while (iterator.hasNext()) {
String element = iterator.next();
// 要素の処理
}
forEachメソッド
Java 8から導入されたラムダ式を利用して、リストの要素を処理します。
List<String> myList = Arrays.asList("apple", "banana", "orange");
myList.forEach(element -> {
// 要素の処理
});
適切な方法の選択
Javaリスト反復処理解説:コード例
List<String> fruits = Arrays.asList("apple", "banana", "orange");
for (int i = 0; i < fruits.size(); i++) {
String fruit = fruits.get(i);
System.out.println(fruit);
}
List<String> fruits = Arrays.asList("apple", "banana", "orange");
for (String fruit : fruits) {
System.out.println(fruit);
}
List<String> fruits = Arrays.asList("apple", "banana", "orange");
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fru it);
}
List<String> fruits = Arrays.asList("apple", "banana", "orange");
ListIterator<String> iterator = fruits.listIterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
List<String> fruits = Arrays.asList("apple", "banana", "orange");
fruits.forEach(fruit -> {
System.out.println(fruit);
});
これらのコードはすべて、リスト fruits
内の要素を順次出力します。
ポイント:
- forループ: インデックスを使用して要素にアクセスします。
- 拡張forループ: 読みやすく、シンプルです。
- Iterator: 汎用的な反復処理に適しています。
- ListIterator: 双方向の反復処理や要素の削除が可能です。
- forEachメソッド: ラムダ式を使用して簡潔に記述できます。
- 拡張forループが多くの場合で使いやすいです。
- IteratorやListIteratorは、より複雑な処理や要素の削除が必要な場合に使用します。
- forEachメソッドは、ラムダ式を使用する際に便利です。
Javaリスト反復処理の代替方法
Javaでは、リストの要素を反復処理するための標準的な方法に加えて、いくつかの代替的なアプローチがあります。以下にその方法を説明します。
Stream API
Java 8から導入されたStream APIを使用すると、リストの要素を関数型プログラミングのスタイルで処理できます。
List<String> fruits = Arrays.asList("apple", "banana", "orange");
fruits.stream()
.filter(fruit -> fruit.startsWith("a"))
.map(String::toUpperCase)
.forEach(System.out::print ln);
このコードは、リストから「a」で始まる要素をフィルタリングし、大文字に変換して出力します。
Parallel Stream
Stream APIの並列処理機能を利用して、複数のスレッドでリストの要素を処理できます。
List<String> fruits = Arrays.asList("apple", "banana", "orange", "pear", "grape");
fruits.parallelStream()
.filter(fruit -> fruit.length() > 5)
.forEach(System.out::println);
このコードは、リストから文字数が6以上の要素をフィルタリングし、並列処理で出力します。
Custom Iterator
独自のイテレータを実装することで、リストの要素を特定の条件や順序で反復処理できます。
class ReverseIterator<T> implements Iterator<T> {
private ListIterator<T> iterator;
public ReverseIterator(List<T> list) {
iterator = list.listIterator(list.size());
}
@Override
public boolean hasNext() {
return iterator.hasPrevious();
}
@Override
public T next() {
return iterato r.previous();
}
}
List<String> fruits = Arrays.asList("apple", "banana", "orange");
ReverseIterator<String> reverseIterator = new ReverseIterator<>(fruits);
while (reverseIterator.hasNext()) {
String fruit = reverseIterator.next();
System.out.println(fruit);
}
このコードは、リストの要素を逆順に出力するイテレータを実装しています。
外部ライブラリ
GuavaやApache Commons Collectionsなどの外部ライブラリには、リストの反復処理を簡略化するためのユーティリティメソッドが提供されています。
java loops collections