単一の要素をストリームに追加する方法

1概要

このクイック記事では、通常のコレクションに要素を追加するのと同じくらい直感的ではない、Java 8 Stream ** に要素を追加する方法について説明します。

2前置き

静的な __Stream . concat () メソッドを呼び出すことで、与えられた要素を簡単に Stream__の前に追加できます。

@Test
public void givenStream__whenPrependingObject__thenPrepended() {
    Stream<Integer> anStream = Stream.of(1, 2, 3, 4, 5);

    Stream<Integer> newStream = Stream.concat(Stream.of(99), anStream);

    assertEquals(newStream.findFirst().get(), (Integer) 99);
}

3追加

同様に、 Streamの末尾に要素を追加するには、 引数を反転するだけです。

  • Streams は無限のシーケンスを表すことができることに注意してください。したがって、新しい要素にたどり着かない可能性があるシナリオがあります。

@Test
public void givenStream__whenAppendingObject__thenAppended() {
    Stream<String> anStream = Stream.of("a", "b", "c", "d", "e");

    Stream<String> newStream = Stream.concat(anStream, Stream.of("A"));

    List<String> resultList = newStream.collect(Collectors.toList());

    assertEquals(resultList.get(resultList.size() - 1), "A");
}

4特定のインデックスで

本質的に Streams はコレクションではなく、インデックスの概念 を認識しないため、この操作は Stream APIでは完全にはサポートされていません。

したがって、これを行うには、 Stream をリストに変換してから要素を挿入し、最後にその新しいリストから Stream を取得する必要があります。

これは望みどおりの結果をもたらしますが、新しい要素を挿入する前にそれを消費する必要があるので、 Stream の怠惰さも失います。

重労働を行うためのユーティリティメソッドを作成しましょう。

public <T> Stream<T> insertInStream(Stream<T> stream, T elem, int index) {
    List<T> result = stream.collect(Collectors.toList());
    result.add(index, elem);
    return result.stream();
}

それでは、すべてが正常に機能していることを確認するために、コードをテストしましょう。

@Test
public void givenStream__whenInsertingObject__thenInserted() {
    Stream<Double> anStream = Stream.of(1.1, 2.2, 3.3);

    Stream<Double> newStream = insertInStream(anStream, 9.9, 3);

    List<Double> resultList = newStream.collect(Collectors.toList());

    assertEquals(resultList.get(3), (Double) 9.9);
}

5結論

この短い記事では、__Streamに単一の要素を追加する方法を説明しました。

要素を先頭に追加することは__Streamには有効ですが、末尾または特定のインデックスに追加することは有限ストリームに対してのみ有効であることに注意してください。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java[over on Github]にあります。