広告

Java : Iterable - API使用例

Iterable (Java SE 22 & JDK 22) の使い方まとめです。
ほとんどのメソッドにサンプルコードがあります。
API仕様書のおともにどうぞ。


概要

このインタフェースを実装すると、オブジェクトが拡張for文("for-eachループ"文とも呼ばれる)のターゲットになることができます。

クラス構成

Iterable は、繰り返し処理できることを表すインタフェースです。
Iterable を実装すると、拡張for文 (for-eachループ文) のターゲットとして使えるようになります。

public class Sample implements Iterable<String> {
    private static final String[] VALUES = {"aaa", "bbb", "ccc"};
    private int index;

    @Override
    public Iterator<String> iterator() {
        return new Iterator<>() {
            @Override
            public boolean hasNext() {
                return VALUES.length != index;
            }

            @Override
            public String next() {
                final var value = VALUES[index];
                index++;
                return value;
            }
        };
    }
}
final var sample = new Sample();
for (final var s : sample) {
    System.out.println(s);
}

// 結果
// ↓
//aaa
//bbb
//ccc

メソッド

default void forEach (Consumer<? super T> action)

Iterableの各要素に対して指定されたアクションを、すべての要素が処理されるか、アクションが例外をスローするまで実行します。

final Iterable<String> it = List.of("aaa", "bbb", "ccc");
System.out.println(it); // [aaa, bbb, ccc]

it.forEach(s -> System.out.println(s));

// 結果
// ↓
//aaa
//bbb
//ccc
final Iterable<Path> it = Path.of("dir1", "dir2", "test.txt");
System.out.println(it); // dir1\dir2\test.txt

it.forEach(System.out::println);

// 結果
// ↓
//dir1
//dir2
//test.txt

Iterator<T> iterator ()

型Tの要素のイテレータを返します。

final Iterable<String> it = List.of("aaa", "bbb", "ccc");
System.out.println(it); // [aaa, bbb, ccc]

final var iterator = it.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

// 結果
// ↓
//aaa
//bbb
//ccc

default Spliterator<T> spliterator ()

このIterableによって記述される要素に対するSpliteratorを作成します。

final Iterable<String> it = List.of("aaa", "bbb", "ccc", "ddd", "eee");
System.out.println(it); // [aaa, bbb, ccc, ddd, eee]

final var s1 = it.spliterator();
System.out.println("s1 size : " + s1.estimateSize()); // s1 size : 5

final var s2 = s1.trySplit();
System.out.println("s1 size : " + s1.estimateSize()); // s1 size : 3
System.out.println("s2 size : " + s2.estimateSize()); // s2 size : 2

s1.forEachRemaining(System.out::println);

// 結果 (s1)
// ↓
//ccc
//ddd
//eee

s2.forEachRemaining(System.out::println);

// 結果 (s2)
// ↓
//aaa
//bbb

関連記事

ページの先頭へ