1. 概要

このチュートリアルでは、Javaでイテレータをコレクションに変換するさまざまな方法について説明します。

プレーンなJavaソリューションから始めて、GuavaおよびApacheCommonsライブラリが提供するオプションを見ていきます。

2. IterableおよびIterator

まず、Iterableを定義します。

Iterable<String> iterable = Arrays.asList("john", "tom", "jane");

また、単純な Iterator を定義して、IterableからCollectionへの変換とIteratorからCollection[への変換の違いを強調します。 X174X]:

Iterator<String> iterator = iterable.iterator();

3. プレーンJavaの使用

3.1. IterableからCollection

Java 8 forEach()メソッドを使用して、すべての要素をListに追加できます。

@Test
public void whenConvertIterableToListUsingJava8_thenSuccess() {
    List<String> result = new ArrayList<String>();
    iterable.forEach(result::add);

    assertThat(result, contains("john", "tom", "jane"));
}

または、 Spliteratorクラスを使用して、IterableをStreamに変換してから、Collectionに変換します。

List<String> result = 
  StreamSupport.stream(iterable.spliterator(), false)
    .collect(Collectors.toList());

3.2. イテレータからコレクション

一方、 forEach()を使用する代わりに、 forEachRemaining()Iteratorとともに使用します。

@Test
public void whenConvertIteratorToListUsingJava8_thenSuccess() {
    List<String> result = new ArrayList<String>();
    iterator.forEachRemaining(result::add);

    assertThat(result, contains("john", "tom", "jane"));
}

IteratorからSpliteratorを作成し、それを使用してIteratorStreamに変換することもできます。

List<String> result = 
  StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false)
    .collect(Collectors.toList());

3.3. Forループの使用

また、非常に単純なforループを使用してIterableListに変換するソリューションも見てみましょう。

@Test
public void whenConvertIterableToListUsingJava_thenSuccess() {
    List<String> result = new ArrayList<String>();
    for (String str : iterable) {
        result.add(str);
    }

    assertThat(result, contains("john", "tom", "jane"));
}

一方、 hasNext() next()Iteratorとともに使用します。

@Test
public void whenConvertIteratorToListUsingJava_thenSuccess() {
    List<String> result = new ArrayList<String>();
    while (iterator.hasNext()) {
        result.add(iterator.next());
    }

    assertThat(result, contains("john", "tom", "jane"));
}

4. グアバの使用

これを達成するのに役立つ便利な方法を提供する利用可能なライブラリもいくつかあります。

Guavaを使用してIterableからListに変換する方法を見てみましょう。

Lists.newArrayList()を使用して、IterableまたはIteratorから新しいListを作成できます。

List<String> result = Lists.newArrayList(iterable);

または、 ImmutableList.copyOf()を使用できます。

List<String> result = ImmutableList.copyOf(iterable);

5. ApacheCommonsの使用

最後に、 Apache Commons IterableUtilsを使用して、Iterableからリストを作成します:

List<String> result = IterableUtils.toList(iterable);

同様に、 IteratorUtils を使用して、IteratorからListを作成します。

List<String> result = IteratorUtils.toList(iterator);

6. 結論

この短い記事では、Javaを使用してIterableおよびIteratorCollectionに変換する方法を学びました。 プレーンJavaと、GuavaとApacheCommonsの2つの外部ライブラリを使用してさまざまな方法を検討しました。

いつものように、完全なソースコードはGitHubで入手できます。