Javaでイテラブルのサイズを取得する
1. 概要
このクイックチュートリアルでは、JavaでIterableのサイズを取得するさまざまな方法について学習します。
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 {
public Iterator iterator();
}
次に、このIteratorを使用して、Iterable内の要素を反復処理できます。
3. Core 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は、ListやSetなどの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.からStreamを作成できます。
次に、ストリームオブジェクトを使用して、Iterableの要素の数を取得できます。
return StreamSupport.stream(data.spliterator(), false).count();
4. サードパーティライブラリを使用した反復可能サイズ
4.1. IterableUtils#size()
Apache Commons Collectionsライブラリには、Iterableインスタンスの静的ユーティリティメソッドを提供する優れたIterableUtilsクラスがあります。
開始する前に、Maven Centralから最新の依存関係をインポートする必要があります。
org.apache.commons
commons-collections4
4.1
IterableオブジェクトでIterableUtilsのsize()メソッドを呼び出して、そのサイズを取得できます。
return IterableUtils.size(data);
4.2. Iterables#size()
同様に、Google Guavaライブラリは、Iterableインスタンスを操作するためのIterablesクラスの静的ユーティリティメソッドのコレクションも提供します。
開始する前に、Maven Centralから最新の依存関係をインポートする必要があります。
com.google.guava
guava
25.0
Iterablesクラスで静的なsize()メソッドを呼び出すと、要素の数がわかります。
return Iterables.size(data);
内部的には、IterableUtilsとIterablesの両方が、3.1と3.2で説明されているアプローチの組み合わせを使用してサイズを決定します。
5. 結論
この記事では、JavaでIterableのサイズを取得するさまざまな方法について説明しました。
この記事のソースコードと関連するテストケースは、over on GitHubで入手できます。