<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Streams%3A_Vereinigen</id>
	<title>Streams: Vereinigen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Streams%3A_Vereinigen"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Vereinigen&amp;action=history"/>
	<updated>2026-05-06T15:27:16Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Streams:_Vereinigen&amp;diff=110&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Category:Java Hat man zwei Listen von Objekten und möchte diese zusammen in einem Stream verarbeiten, kann man alle Objekte in eine gemeinsame Liste stopf…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Vereinigen&amp;diff=110&amp;oldid=prev"/>
		<updated>2023-03-09T17:08:06Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Category:Java&lt;/a&gt; Hat man zwei Listen von Objekten und möchte diese zusammen in einem Stream verarbeiten, kann man alle Objekte in eine gemeinsame Liste stopf…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Java]]&lt;br /&gt;
Hat man zwei Listen von Objekten und möchte diese zusammen in einem Stream verarbeiten, kann man alle&lt;br /&gt;
Objekte in eine gemeinsame Liste stopfen und diese dann ver-streamen. Das ist selten elegant und oft nicht&lt;br /&gt;
möglich. Besser wär&amp;#039;s, zwei Streams zu erzeugen, diese zusammenzuführen und dann das Ergebnis wie einen&lt;br /&gt;
einzigen Stream zu behandeln.&lt;br /&gt;
Das geht ganz einfach mit der – statischem – Methode {{java|Streams.concat()}}.&lt;br /&gt;
In diesem Beispiel wird ein Stream aus dem Elementen eines {{java|List}}-Objekts und eines Arrays gebildet:&lt;br /&gt;
{{java|code=&lt;br /&gt;
List&amp;lt;String&amp;gt; list = Arrays.asList(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;);&lt;br /&gt;
String[] array = {&amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot;};&lt;br /&gt;
Stream&amp;lt;String&amp;gt; strom = Stream.concat(list.stream(), Stream.of(array));&lt;br /&gt;
}}&lt;br /&gt;
Seltsamerweise hat {{java|concat()}} nur zwei Parameter. Um drei Listen zu vereinen, muß man {{java|concat()}} zweimal ineinanderschachteln. Hier fügen wir noch einen dritten Stream hinzu:&lt;br /&gt;
{{java|code=&lt;br /&gt;
List&amp;lt;String&amp;gt; list = Arrays.asList(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;);&lt;br /&gt;
String[] array = { &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot; };&lt;br /&gt;
Stream&amp;lt;String&amp;gt; more = Stream.of(&amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;);&lt;br /&gt;
Stream&amp;lt;String&amp;gt; strom = Stream.concat(Stream.concat(list.stream(), Stream.of(array)), more);&lt;br /&gt;
}}&lt;br /&gt;
Man kann diese Einschränkung bei Bedarf mit einer selbstgeschriebenen Methode umgehen.&lt;br /&gt;
{{java|code=&lt;br /&gt;
private &amp;lt;T&amp;gt; Stream&amp;lt;T&amp;gt; concat(Stream&amp;lt;T&amp;gt;... streams) {&lt;br /&gt;
    Stream&amp;lt;T&amp;gt; result = Stream.empty();&lt;br /&gt;
    for (Stream&amp;lt;T&amp;gt; s : streams) {&lt;br /&gt;
         result = Stream.concat(result, s);&lt;br /&gt;
    }&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Diese Implementierung erfüllt ihren Zweck, ist aber nicht besonders elegant (nicht zuletzt wegen der häßlichen&lt;br /&gt;
for-Schleife). Eine sehr viel schönere Lösung wird in der [[Streams: Daten einkochen|Beschreibung der {{java|reduce}}-Methode]] gezeigt.&lt;br /&gt;
{{java|concat()}} arbeitet mit Streams, also müssen zunächst aus {{java|List}}-Objekt und Array je ein Stream generiert werden.&lt;br /&gt;
Diese werden dann vereint. Gehen wir wieder einen Schritt zurück und betrachten die einzelnen Objekte eines&lt;br /&gt;
Stroms von Objekten.&lt;br /&gt;
&lt;br /&gt;
=== Ströme verbreitern: flatMap() ===&lt;br /&gt;
Hat man nur Objekte eines einzigen Typs – nicht wie im concat-Beispiel oben, das {{java|List}} und {{java|Array}} zusammenbrachte – kann man daraus einen Strom formen.&lt;br /&gt;
Mit der Stream-Methode {{java|flatMap()}} kann man die einzelnen Objekte des Stroms – analog zur Methode {{java|map()}} – verarbeiten. Sie akzeptiert als Eingabe ein Objekt vom Typ des Eingabe-Stroms und liefert als Ergebnis einen Strom von Objekten. Alle dabei entstehenden Ströme werden zu einem&lt;br /&gt;
einzigen Strom zusammengefaßt. Sehen wir uns das an einem Beispiel an:&lt;br /&gt;
{{java|code=&lt;br /&gt;
List&amp;lt;String&amp;gt; list1 = Arrays.asList(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;, &amp;quot;d&amp;quot;);&lt;br /&gt;
List&amp;lt;String&amp;gt; list2 = Arrays.asList( &amp;quot;e&amp;quot;, &amp;quot;f&amp;quot;, &amp;quot;g&amp;quot;, &amp;quot;h&amp;quot; );&lt;br /&gt;
List&amp;lt;String&amp;gt; list3 = Arrays.asList(&amp;quot;i&amp;quot;, &amp;quot;j&amp;quot;, &amp;quot;k&amp;quot;, &amp;quot;l&amp;quot;);&lt;br /&gt;
Stream.of(list1, list2, list3) //&lt;br /&gt;
    .flatMap(List::stream) //&lt;br /&gt;
    .forEach(System.out::print);&lt;br /&gt;
}}&lt;br /&gt;
# Zunächst werden drei {{java|List}}-Objekte erzeugt ({{java|list1}}, {{java|list2}} und {{java|list3}}).&lt;br /&gt;
# Aus diesen wird mit {{java|Stream.of()}} ein {{java|Stream}}-Objekt erzeugt. Der Typ des Streams ist&lt;br /&gt;
#: {{java|Stream&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;}}&lt;br /&gt;
#:Es entsteht also ein Strom, der String-Listen als Elemente enthält.&lt;br /&gt;
# Auf jede Liste im Stream wird nun mit {{java|flatMap()}} die Methode {{java|List.stream()}} angewandt.&lt;br /&gt;
#:Aus jedem {{java|List}}-Objekt wird nun ein Strom von {{java|String}}-Objekten die zu einem einzigen Strom von Strings vereinigt werden.&lt;br /&gt;
# Über {{java|foreach()}} wird schließlich jedes Objekt des Stroms ausgegeben. Das Ergebnis lautet {{java|&amp;quot;abcdefghijkl&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
Die Methode {{java|flatMap()}} ist nicht auf Collections beschränkt. Tatsächlich kann man damit aus jedem Objekt einen Stream machen, wenn man nur die richtige Funktion baut. Hier machen wir aus Strings noch mehr Strings:&lt;br /&gt;
{{java|code=&lt;br /&gt;
Stream.of(&amp;quot;123&amp;quot;, &amp;quot;456&amp;quot;, &amp;quot;789&amp;quot;) //&lt;br /&gt;
    .map(s -&amp;gt; s.split(&amp;quot;&amp;quot;)) //&lt;br /&gt;
    .flatMap(Stream::of) //&lt;br /&gt;
    .forEach(s-&amp;gt;System.out.printf(&amp;quot;[%s]&amp;quot;, s));&lt;br /&gt;
}}&lt;br /&gt;
# Wir beginnen mit einem Stream von drei Strings&lt;br /&gt;
# Wir zerlegen mit {{java|map()}} und {{java|split()}} jeden String in ein Array von Strings, von dem jedes Element ein Zeichen enthält.&lt;br /&gt;
# Dann machen wir mit {{java|flatMap()}} aus jedem Array einen Steam von Strings und vereinen die daraus entstehenden Ströme zu einem einzigen Strom.&lt;br /&gt;
# Schließlich geben wir die einzelnen Zeichen mit umgebenden eckigen Klammern aus.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>