1. 概要

このクイックチュートリアルでは、JavaでIterableのサイズを取得するさまざまな方法について学習します。

2. イテレータとイテレータ

Iterable は、Javaのコレクションクラスの主要なインターフェイスの1つです。

CollectionインターフェイスはIterableを拡張するため、Collectionのすべての子クラスもIterableを実装します。

Iterable には、 Iterator を生成するメソッドが1つだけあります。

public interface Iterable<T> {
    public Iterator<T> iterator();    
}

このIteratorを使用して、Iterableの要素を反復処理できます。

3. コアJavaを使用した反復可能なサイズ

3.1. for-eachループ

Iterable を実装するすべてのクラスは、Javaのfor-eachループに適格です。

これにより、 Iterable の要素をループしながら、カウンターをインクリメントしてサイズを取得できます。

int counter = 0;
for (Object i : data) {
    counter++;
}
return counter;

3.2. Collection.size()

ほとんどの場合、 Iterable は、[X90X] Collection、、たとえばListSetのインスタンスになります。

このような場合、 Iterable のタイプを確認し、 size()メソッドを呼び出して要素数を取得できます。

if (data instanceof Collection) {
    return ((Collection<?>) data).size();
}

size()の呼び出しは、通常、コレクション全体を反復処理するよりもはるかに高速です。

上記の2つのソリューションの組み合わせを示す例を次に示します。 

public static int size(Iterable data) {

    if (data instanceof Collection) {
        return ((Collection<?>) data).size();
    }
    int counter = 0;
    for (Object i : data) {
        counter++;
    }
    return counter;
}

3.3. Stream.count()

Java 8を使用している場合は、IterableからStreamを作成できます。

次に、ストリームオブジェクトを使用して、Iterableの要素の数を取得できます。

return StreamSupport.stream(data.spliterator(), false).count();

4. サードパーティのライブラリを使用した反復可能なサイズ

4.1. IterableUtils#size()

Apache Commons Collections ライブラリには、Iterableインスタンスの静的ユーティリティメソッドを提供する優れたIterableUtilsクラスがあります。

開始する前に、 MavenCentralから最新の依存関係をインポートする必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.1</version>
</dependency>

IterableオブジェクトでIterableUtilssize()メソッドを呼び出して、そのサイズを取得できます。

return IterableUtils.size(data);

4.2. Iterables#size()

同様に、 Google Guava ライブラリは、Iterableインスタンスを操作するためのIterablesクラスの静的ユーティリティメソッドのコレクションも提供します。

開始する前に、 MavenCentralから最新の依存関係をインポートする必要があります。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

Iterablesクラスで静的size()メソッドを呼び出すと、要素の数がわかります。

return Iterables.size(data);

内部的には、IterableUtilsIterablesの両方が、3.1と3.2で説明されているアプローチの組み合わせを使用してサイズを決定します。

5. 結論

この記事では、JavaでIterableのサイズを取得するさまざまな方法について説明しました。

この記事のソースコードと関連するテストケースは、GitHubから入手できます。