<?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_Daten_einkochen</id>
	<title>Streams: Daten einkochen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=Streams%3A_Daten_einkochen"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;action=history"/>
	<updated>2026-06-10T07:43:35Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=113&amp;oldid=prev</id>
		<title>Ullrich am 9. März 2023 um 17:17 Uhr</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=113&amp;oldid=prev"/>
		<updated>2023-03-09T17:17:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 9. März 2023, 17:17 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l93&quot;&gt;Zeile 93:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 93:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;widerwillig erkennt. Wer sie ignoriert ist kein schlechter Mensch, sondern verpaßt nur hie und da die Gelegenheit&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;widerwillig erkennt. Wer sie ignoriert ist kein schlechter Mensch, sondern verpaßt nur hie und da die Gelegenheit&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;sich das Leben zu erleichtern.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;sich das Leben zu erleichtern.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;zitat&lt;/del&gt;|from=Robert Frost|content=&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Zitat&lt;/ins&gt;|from=Robert Frost|content=&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Two roads diverged in a wood, and I—&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Two roads diverged in a wood, and I—&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I took the one less traveled by,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;I took the one less traveled by,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;And that has made all the difference.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;And that has made all the difference.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=111&amp;oldid=prev</id>
		<title>Ullrich am 9. März 2023 um 17:12 Uhr</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=111&amp;oldid=prev"/>
		<updated>2023-03-09T17:12:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 9. März 2023, 17:12 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l12&quot;&gt;Zeile 12:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 12:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Lichte der Java-Streams und schauen mal was sich daraus machen läßt.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Lichte der Java-Streams und schauen mal was sich daraus machen läßt.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Die {{java|map}}-Methode des {{java|Stream}}-Interface haben wir bereits in der [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Einführung in &lt;/del&gt;Java 8 Streams|Einführung]] kennengelernt.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Die {{java|map}}-Methode des {{java|Stream}}-Interface haben wir bereits in der [[Java 8 Streams &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Einführung&lt;/ins&gt;|Einführung]] kennengelernt.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wir wissen also, daß wir die Objekte eines Stroms in nahezu beliebiger Weise verarbeiten können.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Wir wissen also, daß wir die Objekte eines Stroms in nahezu beliebiger Weise verarbeiten können.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kommen wir damit gleich zur reduce-Phase und sehen uns an, wie man die Objekte, die die map-Phase ausgespuckt hat,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Kommen wir damit gleich zur reduce-Phase und sehen uns an, wie man die Objekte, die die map-Phase ausgespuckt hat,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
	<entry>
		<id>https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=108&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Category:Java Map-Reduce ist ein Schlagwort, das nicht zuletzt durch Google bekannt geworden ist und gewöhnlich mit &quot;Big-Data&quot; in Verbindung gebracht wird…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=Streams:_Daten_einkochen&amp;diff=108&amp;oldid=prev"/>
		<updated>2023-03-09T16:54:02Z</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; Map-Reduce ist ein Schlagwort, das nicht zuletzt durch Google bekannt geworden ist und gewöhnlich mit &amp;quot;Big-Data&amp;quot; in Verbindung gebracht wird…“&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;
Map-Reduce ist ein Schlagwort, das nicht zuletzt durch Google bekannt geworden ist und gewöhnlich mit &amp;quot;Big-Data&amp;quot;&lt;br /&gt;
in Verbindung gebracht wird. Das Konzept dahinter ist denkbar einfach: man nehme eine Liste von Daten-Objekten,&lt;br /&gt;
verarbeite jedes Objekt mit irgendeiner Funktion (die map-Phase) und kocht dann die entstandenen – gemappten – Objekte&lt;br /&gt;
zu einem einziegn Ergebnis ein (die reduce-Phase). Entscheidend dabei ist, daß man jedes Objekt unabhängig von den&lt;br /&gt;
anderen verarbeitet und die Reihenfolge in der Reduce-Phase irrelevant ist. Dann hat man die Möglichkeit in einer&lt;br /&gt;
nebenläufigen Umgebung gewaltige Datenmengen schnell und sicher zu verarbeiten.&lt;br /&gt;
&lt;br /&gt;
Daß das Map-Reduce-Pattern seine Wurzeln in der funktionalen Programmierung hat sollte nicht verwundern. Dort war die&lt;br /&gt;
Verwendung der Funktionen map und reduce schon üblich bevor der Bedarf nach &amp;quot;Big Data&amp;quot; überhaupt erfunden&lt;br /&gt;
wurde. Stellen wir die Map-Reduce-Frameworks erstmal zurück, betrachten das zugrundeliegende Konzept im&lt;br /&gt;
Lichte der Java-Streams und schauen mal was sich daraus machen läßt.&lt;br /&gt;
&lt;br /&gt;
Die {{java|map}}-Methode des {{java|Stream}}-Interface haben wir bereits in der [[Einführung in Java 8 Streams|Einführung]] kennengelernt.&lt;br /&gt;
Wir wissen also, daß wir die Objekte eines Stroms in nahezu beliebiger Weise verarbeiten können.&lt;br /&gt;
Kommen wir damit gleich zur reduce-Phase und sehen uns an, wie man die Objekte, die die map-Phase ausgespuckt hat,&lt;br /&gt;
eindampfen kann. Betrachten wir als Beispiel eine Liste von Zahlen, die wir addieren möchten. Besteht&lt;br /&gt;
die Liste aus den Zahlen 17, 23 und 31, dann berechnet sich die Summe wie folgt:&lt;br /&gt;
{{java|code=17 + 23 + 31}}&lt;br /&gt;
oder&lt;br /&gt;
{{java|code=0 + 17 + 23 + 31}}&lt;br /&gt;
oder&lt;br /&gt;
{{java|code=(((0 + 17) + 23) + 31)}}&lt;br /&gt;
Zum Initialwert 0 wird die erste Zahl – die 17 – addiert. Dann wird zum entstandenen Ergebnis die zweite Zahl –&lt;br /&gt;
die 23 – addiert. Zum Ergebnis wird die dritte Zahl – die 31 – addiert. Die Summe entsteht also durch wiederholte&lt;br /&gt;
Anwendung der Funktion &amp;quot;addiere&amp;quot; auf das Zwischenergebnis und die nächste Zahl der Liste.&lt;br /&gt;
&lt;br /&gt;
Wir können das in Java auch mit {{java|Integer}}-Objekten und der Methode {{java|Integer.sum()}} schreiben.&lt;br /&gt;
Wir erlauben uns dabei, das Autoboxing-Feature von Java zu nutzen um die {{java|Integer}}-Objekte nicht explizit&lt;br /&gt;
erzeugen zu müssen:&lt;br /&gt;
{{java|code=Integer.sum(Integer.sum(Integer.sum(0, 17), 23), 31)}}&lt;br /&gt;
Der geneigte Leser wird sich nun vielleicht fragen, was der ganze Blödsinn soll, für Zahlen gibt es in Java den&lt;br /&gt;
einfachen Typ {{java|int}}, zum Addieren das {{java|+}} und für Schleifen das {{java|for}}.&lt;br /&gt;
&lt;br /&gt;
Die Addition von Zahlen ist wohl das einfachste Beispiel und lenkt die Aufmerkamkeit nicht vom Wesentlichen ab.&lt;br /&gt;
An Stelle der {{java|Integer}}-Objekte lassen sich natürlich Objekte jeden beliebigen Typs verwenden&lt;br /&gt;
und Schleifen sind out – den Streams gehört die Zukunft.&lt;br /&gt;
&lt;br /&gt;
Also erstmal das Wie, dann das Warum: &lt;br /&gt;
==&amp;#039;&amp;#039;Wie&amp;#039;&amp;#039; führt man die Verarbeitung mit einem Stream durch?==&lt;br /&gt;
&lt;br /&gt;
Einen Stream aus den Zahlen zu erzeugen ist einfach:&lt;br /&gt;
{{java|code=Stream&amp;lt;Integer&amp;gt; stream = Stream.of(17, 23, 31);}}&lt;br /&gt;
Wie wenden wir nun die Summe darauf an? Das {{java|Stream}}-Interface bietet dafür die Methode {{java|reduce()}}.&lt;br /&gt;
Nach der Klassifizierung in der [[Einführung in Java 8 Streams|Einführung]] handelt es sich um eine Methode des&lt;br /&gt;
Schrittes drei, die die Verarbeitung im Stream abschließt. Sie kommt in drei Geschmacksrichtungen, von denen wir&lt;br /&gt;
diese – ausgesprochen generisch definierte – Form verwenden:&lt;br /&gt;
{{java|code=T reduce(T identity, BinaryOperator&amp;lt;T&amp;gt; accumulator);}}&lt;br /&gt;
Zur Erklärung:&lt;br /&gt;
* {{java|T}} ist der Typ des Stroms, in unserem Falle also {{java|Integer}}.&lt;br /&gt;
* {{java|identity}} ist hier der Startwert der Reduktion, für die Summen-Bildung also die 0.&lt;br /&gt;
* {{java|accumulator}} ist die Funktion, die sukzessive angewandt werden soll, also {{java|Integer.sum()}}&lt;br /&gt;
&lt;br /&gt;
Die Anwendung von {{java|reduce()}} erfordert für die Berechnung also einen Startwert und eine Funktion – in Form eines&lt;br /&gt;
{{lambda}}-Ausdrucks – die zwei Objekte vom Typ des Stroms als Argumente übernimmt und ein Objekt dieses Typs&lt;br /&gt;
zurückgibt. Die Methode {{java|sum()}} erfüllt genau diese Bedingungen für den Typ {{java|Integer}}.&lt;br /&gt;
Damit ist die Summenbildung schon geschrieben.&lt;br /&gt;
{{java|code=int summe = Stream.of(17, 23, 31).reduce(0, Integer::sum);}}&lt;br /&gt;
In unserem Beispiel hat der Start-Wert immer den gleichen Wert 0, die Summe kann also ebensogut mit dem ersten Wert des&lt;br /&gt;
Stroms beginnen. Wir können daher die einfachere Form der {{java|reduce}}-Methode verwenden, die ohne die Angabe eines Startwertes auskommt:&lt;br /&gt;
{{java|code=int summe = Stream.of(17, 23, 31).reduce(Integer::sum).orElse(0);}}&lt;br /&gt;
Da der Stream leer sein kann, liefert die zweite {{java|reduce}}-Variante – weil sie keinen initialen Wert hat – kein&lt;br /&gt;
{{java|Integer}}-Objekt, sondern verpackt das Ergebnis in ein Objekt des Typs {{java|Optional&amp;lt;Integer&amp;gt;}}. Wir fügen daher&lt;br /&gt;
den Wert für die leere Liste über die {{java|orElse}}-Methode hinzu.&lt;br /&gt;
&lt;br /&gt;
Was bringt das nun?&lt;br /&gt;
&lt;br /&gt;
==&amp;#039;&amp;#039;Warum&amp;#039;&amp;#039; führt man die Verarbeitung mit einem Stream durch?==&lt;br /&gt;
&lt;br /&gt;
Zunächst einmal sind Stream-Methoden wie {{java|count}}, {{java|min}}, {{java|max}} nach diesem&lt;br /&gt;
Mechanismus implementiert – mit der entsprechenden Code-Ersparnis. Darüber hinaus finden sich jederzeit weitere&lt;br /&gt;
Anwendungsmöglichkeiten. Erinnern wir uns an die auf zwei Argumente limitierte Methode {{java|Stream.concat()}},&lt;br /&gt;
die zwei Streams mischt. Die konventionelle Lösung erstreckte sich über endlose fünf Zeilen.&lt;br /&gt;
&lt;br /&gt;
Mit {{java|reduce()}} wird eine daraus:&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;
    return Stream.of(streams).reduce(Stream::concat).orElseGet(Stream::empty);&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Im Detail:&lt;br /&gt;
* Zunächst erzeugen wir aus dem Array von Stream-Objekten einen Strom.&lt;br /&gt;
* Dann reduzieren wir die Streams auf einen einzigen indem wir sukzessive die Streams mit der {{java|concat()}}-Methode zusammenketteln.&lt;br /&gt;
* Schließlich reagieren wir hier auf den leeren Stream mit dem Aufruf der {{java|orElse}}-Methode des Optional&lt;br /&gt;
:(und geben so der etwas esoterisch anmutenden {{java|empty}}-Methode endlich eine Daseinsberechtigung).&lt;br /&gt;
&lt;br /&gt;
Wenn erforderlich kann man map-reduce-Code unter Verwendung eines passenden Frameworks auch mit sehr&lt;br /&gt;
großen Datenmengen in hochperformante Lösungen verwandeln, weil das Problem schon entsprechend&lt;br /&gt;
aufbereitet wurde. Aber auch wenn das nicht der Fall ist – das Ergebnis ist elegant, kompakt und skaliert&lt;br /&gt;
hervorragend nach unten: Auch kleine Datenmengen werden performant verarbeitet.&lt;br /&gt;
Die Verwendung des map-reduce-Pattern mit Java-Streams ist enorm flexibel. Daß das nicht immer sofort in&amp;#039;s Auge&lt;br /&gt;
springt liegt daran, daß das auf Objektorientierung getrimmte Entwicklerhirn funktionale Muster nur sehr&lt;br /&gt;
widerwillig erkennt. Wer sie ignoriert ist kein schlechter Mensch, sondern verpaßt nur hie und da die Gelegenheit&lt;br /&gt;
sich das Leben zu erleichtern.&lt;br /&gt;
{{zitat|from=Robert Frost|content=&lt;br /&gt;
Two roads diverged in a wood, and I—&lt;br /&gt;
I took the one less traveled by,&lt;br /&gt;
And that has made all the difference.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>