{"id":375,"date":"2024-05-06T00:00:02","date_gmt":"2024-05-05T23:00:02","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=375"},"modified":"2024-06-05T00:01:30","modified_gmt":"2024-06-04T23:01:30","slug":"stream-collectors-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=375","title":{"rendered":"Stream-Collectors in Java"},"content":{"rendered":"\n<p>Java Streams sind seit der Einf\u00fchrung in Java 8 ein m\u00e4chtiges Werkzeug zur Verarbeitung von Datenstr\u00f6men. Sie bieten eine klare und deklarative Art, Daten zu verarbeiten, und sind besonders n\u00fctzlich, um gro\u00dfe Datenmengen effizient zu handhaben. Ein wesentlicher Bestandteil dieses Systems sind die sogenannten &#8222;Collector&#8220;. In diesem Artikel werden wir die verschiedenen Arten von Stream-Collector in Java detailliert untersuchen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Was sind Collectors?<\/h4>\n\n\n\n<p>Ein Collector ist ein Interface im Paket <code>java.util.stream<\/code>, das vordefinierte Methoden f\u00fcr das Sammeln von Elementen aus einem Stream bereitstellt. Sie bieten die M\u00f6glichkeit, Elemente in verschiedene Formen von Ergebnissen zu transformieren, wie Listen, Mengen, Karten oder sogar einzelne Werte.<\/p>\n\n\n\n<p>Das Interface <code>Collector&lt;T, A, R&gt;<\/code> definiert drei generische Typen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>T<\/strong>: Der Typ der Eingabeelemente im Stream.<\/li>\n\n\n\n<li><strong>A<\/strong>: Der Akkumulatortyp, der die Zwischenzust\u00e4nde w\u00e4hrend der Sammlung speichert.<\/li>\n\n\n\n<li><strong>R<\/strong>: Der Ergebnis-Typ, der nach Abschluss der Sammlung zur\u00fcckgegeben wird.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">2. Standard-Collector<\/h4>\n\n\n\n<p>Die Standard-Collector sind Teil der Java-Standardbibliothek und decken die h\u00e4ufigsten Anwendungsf\u00e4lle ab. Hier sind einige der wichtigsten:<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">2.1 <code>Collectors.toList()<\/code><\/h5>\n\n\n\n<p>Dieser Collector sammelt die Elemente eines Streams in eine <code>List<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">List&lt;<span class=\"hljs-built_in\">String<\/span>&gt; names = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(Collectors.toList());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2.2 <code>Collectors.toSet()<\/code><\/h5>\n\n\n\n<p>Dieser Collector sammelt die Elemente eines Streams in eine <code>Set<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Set<\/span>&lt;<span class=\"hljs-built_in\">String<\/span>&gt; uniqueNames = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Alice\"<\/span>).collect(Collectors.toSet());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2.3 <code>Collectors.toMap()<\/code><\/h5>\n\n\n\n<p>Dieser Collector sammelt die Elemente eines Streams in eine <code>Map<\/code>. Es erfordert zwei Funktionen: eine zum Extrahieren des Schl\u00fcssels und eine zum Extrahieren des Wertes.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Map<\/span>&lt;Integer, <span class=\"hljs-built_in\">String<\/span>&gt; nameMap = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>)\n    .collect(Collectors.toMap(<span class=\"hljs-built_in\">String<\/span>::length, <span class=\"hljs-built_in\">Function<\/span>.identity()));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2.4 <code>Collectors.joining()<\/code><\/h5>\n\n\n\n<p>Dieser Collector verbindet die Elemente eines Streams zu einer einzigen <code>String<\/code>. Er bietet auch \u00dcberladungen, um Trennzeichen, Pr\u00e4fixe und Suffixe anzugeben.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">String<\/span> concatenated = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(Collectors.joining(<span class=\"hljs-string\">\", \"<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2.5 <code>Collectors.counting()<\/code><\/h5>\n\n\n\n<p>Dieser Collector z\u00e4hlt die Elemente eines Streams.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">long count = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(Collectors.counting());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">2.6 <code>Collectors.summingInt()<\/code>, <code>Collectors.averagingInt()<\/code><\/h5>\n\n\n\n<p>Diese Collector summieren bzw. berechnen den Durchschnitt der int-Werte eines Streams.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">int totalLength = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(Collectors.summingInt(<span class=\"hljs-built_in\">String<\/span>::length));\ndouble averageLength = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(Collectors.averagingInt(<span class=\"hljs-built_in\">String<\/span>::length));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">3. Komplexere Collector<\/h4>\n\n\n\n<p>Neben den grundlegenden Collectors gibt es auch fortgeschrittenere, die m\u00e4chtigere Operationen erm\u00f6glichen:<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">3.1 <code>Collectors.groupingBy()<\/code><\/h5>\n\n\n\n<p>Dieser Collector gruppiert die Elemente eines Streams nach einem Klassifizierungskriterium.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Map<\/span>&lt;Integer, List&lt;<span class=\"hljs-built_in\">String<\/span>&gt;&gt; groupedByLength = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>)\n    .collect(Collectors.groupingBy(<span class=\"hljs-built_in\">String<\/span>::length));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">3.2 <code>Collectors.partitioningBy()<\/code><\/h5>\n\n\n\n<p>Dieser Collector partitioniert die Elemente eines Streams nach einem Pr\u00e4dikat in zwei Gruppen: eine, die das Pr\u00e4dikat erf\u00fcllt, und eine, die es nicht erf\u00fcllt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-built_in\">Map<\/span>&lt;<span class=\"hljs-built_in\">Boolean<\/span>, List&lt;<span class=\"hljs-built_in\">String<\/span>&gt;&gt; partitionedByLength = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>)\n    .collect(Collectors.partitioningBy(s -&gt; s.length() &gt; <span class=\"hljs-number\">3<\/span>));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">3.3 <code>Collectors.reducing()<\/code><\/h5>\n\n\n\n<p>Dieser Collector reduziert die Elemente eines Streams zu einem einzigen Wert, indem er einen Akkumulator und eine Identit\u00e4t verwendet.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Optional&lt;<span class=\"hljs-built_in\">String<\/span>&gt; longestName = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>)\n    .collect(Collectors.reducing((s1, s2) -&gt; s1.length() &gt; s2.length() ? s1 : s2));<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">4. Benutzerdefinierte Collector<\/h4>\n\n\n\n<p>Manchmal reichen die vordefinierten Collector nicht aus und es ist notwendig, benutzerdefinierte Collector zu erstellen. Dies kann durch die Implementierung des <code>Collector<\/code>-Interfaces oder durch die Verwendung der statischen Methode <code>Collector.of()<\/code> geschehen.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">4.1 Implementierung des <code>Collector<\/code>-Interfaces<\/h5>\n\n\n\n<p>Ein benutzerdefinierter Collector muss die Methoden <code>supplier()<\/code>, <code>accumulator()<\/code>, <code>combiner()<\/code>, <code>finisher()<\/code> und <code>characteristics()<\/code> implementieren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ToCustomListCollector<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Collector<\/span>&lt;<span class=\"hljs-title\">T<\/span>, <span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;, <span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;&gt; <\/span>{\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Supplier&lt;<span class=\"hljs-keyword\">List<\/span>&lt;T&gt;&gt; supplier() {\n        <span class=\"hljs-keyword\">return<\/span> ArrayList::new;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> BiConsumer&lt;<span class=\"hljs-keyword\">List<\/span>&lt;T&gt;, T&gt; accumulator() {\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">List<\/span>::add;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> BinaryOperator&lt;<span class=\"hljs-keyword\">List<\/span>&lt;T&gt;&gt; combiner() {\n        <span class=\"hljs-keyword\">return<\/span> (left, right) -&gt; { \n            left.addAll(right); \n            <span class=\"hljs-keyword\">return<\/span> left; \n        };\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">Function<\/span>&lt;<span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;, <span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;&gt; <span class=\"hljs-title\">finisher<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">Function<\/span>.<span class=\"hljs-title\">identity<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> Set&lt;Characteristics&gt; characteristics() {\n        <span class=\"hljs-keyword\">return<\/span> Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Verwendung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">List&lt;<span class=\"hljs-built_in\">String<\/span>&gt; customList = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>)\n    .collect(<span class=\"hljs-keyword\">new<\/span> ToCustomListCollector&lt;&gt;());<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h5 class=\"wp-block-heading\">4.2 Verwendung von <code>Collector.of()<\/code><\/h5>\n\n\n\n<p><code>Collector.of()<\/code> bietet eine einfachere M\u00f6glichkeit, benutzerdefinierte Collector zu erstellen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">Collector&lt;String, <span class=\"hljs-keyword\">List<\/span>&lt;String&gt;, <span class=\"hljs-keyword\">List<\/span>&lt;String&gt;&gt; customCollector = \n    Collector.of(ArrayList::new, <span class=\"hljs-keyword\">List<\/span>::add, (left, right) -&gt; { \n        left.addAll(right); \n        <span class=\"hljs-keyword\">return<\/span> left; \n    });\n\n<span class=\"hljs-keyword\">List<\/span>&lt;String&gt; customList = Stream.of(<span class=\"hljs-string\">\"Alice\"<\/span>, <span class=\"hljs-string\">\"Bob\"<\/span>, <span class=\"hljs-string\">\"Charlie\"<\/span>).collect(customCollector);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">5. Eigenschaften von Collector<\/h4>\n\n\n\n<p>Collector haben verschiedene Eigenschaften, die ihr Verhalten bestimmen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>UNORDERED<\/strong>: Die Sammlung muss nicht in der Reihenfolge der Stream-Elemente erfolgen.<\/li>\n\n\n\n<li><strong>CONCURRENT<\/strong>: Der Collector kann mehrere Threads zur gleichen Zeit verwenden.<\/li>\n\n\n\n<li><strong>IDENTITY_FINISH<\/strong>: Der Akkumulatortyp und der Ergebnis-Typ sind gleich, sodass der Akkumulator direkt als Ergebnis verwendet werden kann.<\/li>\n<\/ul>\n\n\n\n<p>Diese Eigenschaften k\u00f6nnen durch das Setzen der <code>characteristics()<\/code>-Methode im Collector angegeben werden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6. Fazit<\/h4>\n\n\n\n<p>Stream-Collector in Java bieten eine flexible und leistungsstarke M\u00f6glichkeit, Daten zu sammeln und zu transformieren. Von einfachen Sammlungen wie Listen und Mengen bis hin zu komplexeren Gruppierungen und Reduktionen decken die Standard-Collector die meisten Anwendungsf\u00e4lle ab. F\u00fcr spezifische Bed\u00fcrfnisse k\u00f6nnen benutzerdefinierte Collector implementiert werden, was die Vielseitigkeit und Anpassungsf\u00e4higkeit von Java Streams weiter erh\u00f6ht. Das Verst\u00e4ndnis und die effiziente Nutzung dieser Werkzeuge kann die Datenverarbeitung erheblich vereinfachen und optimieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java Streams sind seit der Einf\u00fchrung in Java 8 ein m\u00e4chtiges Werkzeug zur Verarbeitung von Datenstr\u00f6men. Sie bieten eine klare und deklarative Art, Daten zu verarbeiten, und sind besonders n\u00fctzlich, um gro\u00dfe Datenmengen effizient zu handhaben. Ein wesentlicher Bestandteil dieses Systems sind die sogenannten &#8222;Collector&#8220;. In diesem Artikel werden wir die verschiedenen Arten von Stream-Collector [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-375","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=375"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/375\/revisions"}],"predecessor-version":[{"id":376,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/375\/revisions\/376"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}