Die Frage widerlegt eine falsche Annahme: Streams enthalten tatsächlich ihre Daten. Sie nicht; Streams sind keine Datenstrukturen, sondern ein Mittel zum Spezifizieren von Massenoperationen in einer Vielzahl von Datenquellen.
Es gibt Kombinatoren zum Kombinieren von zwei Streams zu einem, z. B. Stream.concatFabriken zum Erstellen von Streams aus einer Reihe bekannter Elemente ( Stream.of) oder aus Sammlungen ( Collection.stream). Sie können diese also kombinieren, wenn Sie einen neuen Stream erstellen möchten, der die Verkettung des vorhandenen Streams darstellt, sowie einen neuen Stream, der die neuen Elemente beschreibt.
Das Problem in Ihrem PECS-Beispiel besteht darin, dass Sie drei Vorkommen ? super Thaben und davon ausgehen, dass sie denselben Typ beschreiben, dies jedoch nicht. Jedes Auftreten eines Platzhalters entspricht einer eindeutigen Erfassung, die nicht Ihren Wünschen entspricht. Sie müssen dieser Typvariablen einen Namen geben, damit der Compiler weiß, dass der Typ der Liste und der Typ des Eingabestreams identisch sind. (Materialisieren Sie auch keine Sammlung; das ist teuer und möglicherweise nicht terminierbar, wenn der Stream nicht endlich ist. Verwenden Sie einfach concat.) Die Antwort lautet also: Sie haben gerade die Generika falsch verstanden. Hier ist eine Möglichkeit, dies zu tun:
public<T> Stream<T> appendToStream(Stream<? extends T> stream, T element) {
return Stream.concat(stream, Stream.of(element));
}
Sie haben sich mit PECS verwechselt, weil Sie darüber nachgedacht haben, in den Stream einzufügen, obwohl Sie tatsächlich davon konsumieren.
Listvoncollect(Collectors.toList())Support zurückgegebenenaddDaten verwendet werden.Collectors.toCollectionStattdessen können Sie den Listentyp auswählen, den Sie erhalten.