Comment ajouter un seul élément à un flux

Comment ajouter un seul élément à un flux

1. Vue d'ensemble

Dans cet article rapide, nous allons voir commentadd an element to a Java 8 Stream qui n'est pas aussi intuitif que l'ajout d'un élément à une collection normale.

2. Prepending

Nous pouvons facilement ajouter un élément donné à unStream en invoquant la méthode statiqueStream.concat _ () _:

@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. Ajout

De même, pour ajouter un élément à la fin d'unStream,, nous devons simplement inverser les arguments.

Gardez à l'esprit queStreams can represent infinite sequences donc il y a des scénarios où vous pourriez ne jamais arriver à votre nouvel élément:

@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. À un index spécifique

Cette opération n'est pas entièrement prise en charge par l'APIStream car essentiellementStreams are not collections and do not recognize the concept of indexes.

Donc, pour ce faire, nous devons convertir lesStream en une liste, puis insérer l'élément, et enfin, obtenir unStream de cette nouvelle liste.

Gardez à l'esprit que cela vous donnera le résultat souhaité, mais vous obtiendrez égalementlose the laziness of a Stream because we need to consume it before inserting a new element.

Créons une méthode utilitaire pour effectuer le gros travail:

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

Maintenant, testons notre code pour nous assurer que tout fonctionne comme prévu:

@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. Conclusion

Dans ce court article, nous avons vu comment ajouter un seul élément à unStream, que ce soit au début, à la fin ou à une position donnée.

Gardez à l'esprit que bien que l'ajout d'un élément au début fonctionne pour toutStream,, l'ajout à la fin ou à un index spécifique ne fonctionne que pour les flux finis.

Comme toujours, le code source complet peut être trouvéover on Github.