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.concat
Fabriken 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 T
haben 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.
List
voncollect(Collectors.toList())
Support zurückgegebenenadd
Daten verwendet werden.Collectors.toCollection
Stattdessen können Sie den Listentyp auswählen, den Sie erhalten.