Javaでストリーミング可能

Javaでストリーミング可能

1. 概要

この短いチュートリアルでは、JavaIterableオブジェクトをStreamに変換し、いくつかの標準操作を実行してみましょう。

2. IterableStreamに変換する

Iterableインターフェースは、一般性を念頭に置いて設計されており、それ自体ではstream()メソッドを提供しません。

簡単に言えば、それをStreamSupport.stream()メソッドに渡して、指定されたIterableインスタンスからStreamを取得できます。

Iterableインスタンスについて考えてみましょう。

Iterable iterable
  = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

そして、このIterableインスタンスをStream:に変換する方法は次のとおりです。

StreamSupport.stream(iterable.spliterator(), false);

StreamSupport.stream()の2番目のパラメーターは、結果のStreamが並列であるか順次であるかを決定することに注意してください。 並列Streamの場合は、trueに設定する必要があります。

それでは、実装をテストしましょう。

@Test
public void givenIterable_whenConvertedToStream_thenNotNull() {
    Iterable iterable
      = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

    Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false));
}

また、簡単な補足–ストリームは再利用できませんが、Iterableは再利用できます。また、spliterator()メソッドも提供します。このメソッドは、指定されたIterableによって記述された要素に対してjava.lang.Spliterator instanceを返します。

3. Stream操作の実行

簡単なストリーム操作を実行してみましょう。

@Test
public void whenConvertedToList_thenCorrect() {
    Iterable iterable
      = Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");

    List result = StreamSupport.stream(iterable.spliterator(), false)
      .map(String::toUpperCase)
      .collect(Collectors.toList());

    assertThat(
      result, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM"));
}

4. 結論

この簡単なチュートリアルでは、他のCollectionインスタンスの場合と同じように、IterableインスタンスをStreamインスタンスに変換し、標準操作を実行する方法を示します。

すべてのコードスニペットの実装は、Github projectにあります。