Ajout d’une nouvelle valeur au stream existant

Est-il possible d’append une nouvelle valeur au Stream existant? Tout ce que je peux imaginer, c’est quelque chose comme ça:

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

Mais je cherche quelque chose de plus concis que je puisse utiliser dans l’expression lambda sans verbosité.

Une autre question est apparue lorsque j’ai essayé de mettre en œuvre le principe PECS :

 public  Stream addToStream(Stream stream, T elem ) { List result = stream.collect(Collectors.toList()); //error result.add(elem); return result.stream(); } 

On dirait que le joker ne fonctionne pas avec Stream.collect et je me demande pourquoi. Merci d’avance.

La question contredit une hypothèse erronée: les stream contiennent effectivement leurs données. Ils ne; les stream ne sont pas des structures de données, ils permettent de spécifier des opérations en bloc sur diverses sources de données.

Il existe des combinateurs pour combiner deux stream en un seul, comme Stream.concat , et des fabriques pour créer des stream à partir d’un ensemble d’éléments connus ( Stream.of ) ou de collections ( Collection.stream ). Vous pouvez donc les combiner si vous voulez produire un nouveau stream qui est la concaténation du stream que vous avez en main, ainsi qu’un nouveau stream décrivant les nouveaux éléments.

Le problème dans votre exemple PECS est que vous avez trois occurrences de ? super T ? super T , et vous supposez qu’ils décrivent le même type, mais ils ne le font pas. Chaque occurrence d’un caractère générique correspond à une capture unique, ce qui n’est pas ce que vous voulez. vous devez donner un nom à cette variable de type pour que le compilateur sache que le type de la liste et le type du stream d’entrée sont les mêmes. (Aussi, ne matérialisez pas une collection, c’est cher, et potentiellement non résiliant si le stream n’est pas fini. Utilisez simplement concat.) Donc, la réponse est: vous venez d’obtenir des génériques erronés. Voici une façon de le faire:

 public Stream appendToStream(Stream stream, T element) { return Stream.concat(stream, Stream.of(element)); } 

Vous vous êtes confondu avec PECS parce que vous pensiez à “insérer” dans le stream, alors qu’en fait vous en consumz.

Que diriez-vous

 return Stream.concat(stream, Stream.of(elem)); 

ceci suppose que le Stream original est fini. Si ce n’est pas le cas, vous pouvez les concilier dans un ordre inversé.

La bibliothèque StreamEx a les #prepend() et #append() appropriées. Voici un exemple de leur utilisation:

 StreamEx.of("second").prepend("first").append("third").forEach(System.out::println); 

Une sortie est la suivante:

 first second third