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

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

1. 概要

この簡単な記事では、通常のコレクションに要素を追加するほど直感的ではないadd an element to a Java 8 Streamの方法を見ていきます。

2. 接頭辞

静的なStream.concat _()_メソッドを呼び出すことにより、特定の要素をStreamの前に簡単に追加できます。

@Test
public void givenStream_whenPrependingObject_thenPrepended() {
    Stream anStream = Stream.of(1, 2, 3, 4, 5);

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

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

3. 追記

同様に、Stream,の末尾に要素を追加するには、引数を反転する必要があります。

Streams can represent infinite sequencesであるため、新しい要素に到達できないシナリオがあることに注意してください。

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

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

    List resultList = newStream.collect(Collectors.toList());

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

4. 特定のインデックスで

基本的にStreams are not collections and do not recognize the concept of indexesであるため、この操作はStreamAPIでは完全にはサポートされていません。

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

これにより目的の結果が得られますが、lose the laziness of a Stream because we need to consume it before inserting a new element.も得られることに注意してください。

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

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

それでは、コードをテストして、すべてが期待どおりに機能していることを確認しましょう。

@Test
public void givenStream_whenInsertingObject_thenInserted() {
    Stream anStream = Stream.of(1.1, 2.2, 3.3);

    Stream newStream = insertInStream(anStream, 9.9, 3);

    List resultList = newStream.collect(Collectors.toList());

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

5. 結論

この短い記事では、最初、最後、または特定の位置で、Stream,に単一の要素を追加する方法を説明しました。

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

いつものように、完全なソースコードはover on Githubで見つけることができます。