1.概要

このクイックチュートリアルでは、https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html[

Iterable

]のサイズを取得するためのさまざまな方法について説明します。 Javaで。

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


  • Iterable

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



Collection


インタフェースは

Iterable

を拡張するため、

Collection

のすべての子クラスも

Iterable

を実装します。


Iterable

はhttps://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

__:

__を生成するメソッドを1つだけ持っています。

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

その後、この

Iterator

を使用して

Iterable

内の要素を反復処理できます。

3.コアJavaを使った反復可能サイズ

3.1.

for-each

ループ


  • Iterable

    を実装するすべてのクラスは、Javaのhttps://docs.oracle.com/javase/8/docs/technotes/guides/language/foreach.html[

    for-each

    ]ループに適しています。**

これにより、サイズを取得するためにカウンタをインクリメントしながら、

Iterable

内の要素をループ処理できます。

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

3.2.

Collection.size()

  • ほとんどの場合、

    Iterable

    は____Collectionのインスタンスになります。

そのような場合は、

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からhttps://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html[

    Stream__]を作成できます。

その後、ストリームオブジェクトを使用して

Iterable

の要素数を取得できます。

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

4.他社製ライブラリを使用した反復可能サイズ

4.1.

IterableUtils#size()


  • Apache Commons Collections

    ライブラリには、

    Iterable

    インスタンス用の静的ユーティリティメソッドを提供する素晴らしいhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/IterableUtils.html[

    IterableUtils

    ]クラスがあります。**

開始する前に、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commonsから最新の依存関係をインポートする必要があります。 -collections4%22[メイヴン中央]:

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

サイズを取得するには、

Iterable

オブジェクトに対して

IterableUtils



size()

メソッドを呼び出します。

return IterableUtils.size(data);

4.2.

Iterables#size()

  • 同様に、

    Google Guava

    ライブラリでも、https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/collect/Iterables.html#sizeに静的ユーティリティメソッドのコレクションが用意されています(java.lang.Iterable)

    Iterable

    インスタンスを操作するクラス。**

始める前に、https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.google.guava%22%20AND%20a%3A%22guavaから最新の依存関係をインポートする必要があります。 %22[メイヴン中央]:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>25.0</version>
</dependency>


Iterables

クラスで静的

size()

メソッドを呼び出すと、要素数がわかります。

return Iterables.size(data);

内部的には、

IterableUtils



Iterables

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

5.まとめ

この記事では、Javaで

Iterable

のサイズを取得するさまざまな方法を調べました。

この記事のソースコードと関連するテストケースはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[GitHubで利用可能]です。