{"id":218774,"date":"2022-01-04T15:46:00","date_gmt":"2022-01-04T14:46:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/"},"modified":"2022-01-19T15:49:10","modified_gmt":"2022-01-19T14:49:10","slug":"kotlin-1-6-0-is-released","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/de\/kotlin\/2022\/01\/kotlin-1-6-0-is-released\/","title":{"rendered":"Kotlin 1.6.0 ver\u00f6ffentlicht"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<p>Kotlin 1.6.0 ist jetzt offiziell ver\u00f6ffentlicht \u2013 mit Stable-Status f\u00fcr abschlie\u00dfende <code>when<\/code>-Bl\u00f6cke, dem Code-Coverage-Tool Kover und einem neuen Speichermanager f\u00fcr Kotlin\/Native. Auch andere Neuerungen in der Sprache und den Standardbibliotheken, die in 1.5.30 ver\u00f6ffentlicht wurden, wurden in den Status <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Stable<\/a> bef\u00f6rdert. Vielen Dank f\u00fcr das Feedback, das Sie uns zukommen lie\u00dfen. Wenn Sie diese neuen Features noch nicht ausprobiert haben \u2013 jetzt ist es h\u00f6chste Zeit!<\/p>\n\n\n\n<p>In diesem Blogbeitrag finden Sie einen \u00dcberblick \u00fcber die folgenden Updates:<\/p>\n\n\n\n<ul><li>Neue <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#language-features\" class=\"ek-link\">Sprachmerkmale<\/a>: versiegelte when-Anweisungen, suspendierende Funktionen und entsprechende Umwandlungen, Instanziierung von Annotationsklassen, verbesserte Typinferenz f\u00fcr regul\u00e4re und Builder-Typen.<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#jvm\" class=\"ek-link\">Kotlin\/JVM<\/a> mit optimierten delegierten Eigenschaften und wiederholbaren Annotationen.<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#native\" class=\"ek-link\">Kotlin\/Native<\/a> mit der Preview eines neuen Speichermodells, Xcode-13-Unterst\u00fctzung, Kreuzkompilierung von Windows-Zielen, LLVM- und Linker-Updates, Leistungsupdates und einer einheitlichen Compiler-Plugin-ABI.<\/li><li>Optionale Deaktivierung des Herunterladens von Node.js und Yarn f\u00fcr <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#js\" class=\"ek-link\">Kotlin\/JS<\/a>.<\/li><li>Ank\u00fcndigung von <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#kover\" class=\"ek-link\">Kover<\/a>.<\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#standard-library\" class=\"ek-link\">Standardbibliothek<\/a> mit neuen Funktionen f\u00fcr die Standardeingabe, stabiler <code>typeOf()<\/code>-Funktion, stabiler Duration-API und weiteren stabilen stdlib-Funktionen.<\/li><\/ul>\n\n\n\n<span id=\"more-202424\"><\/span>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Das ist neu in Kotlin 1.6.0\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/6jrmcfYdfvI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><a href=\"https:\/\/info.jetbrains.com\/kotlin-communication-center-page.html\" target=\"_blank\" rel=\"noopener\"><strong><em>Abonnieren<\/em><\/strong><\/a><strong><em> <strong><em>Sie unser Blog, um keine Kotlin-Updates zu verpassen!<\/em><\/strong><\/em><\/strong><\/p>\n\n\n\n<h1>So f\u00fchren Sie das Update durch<\/h1>\n\n\n\n<p>Wenn Sie <a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> oder <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> verwenden, haben Sie die M\u00f6glichkeit, automatisch auf die neue Kotlin-Version zu aktualisieren.<\/p>\n\n\n\n<p>Weitere Informationen zur <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/#how-to-install\" class=\"ek-link\">Installation von Kotlin 1.6.0<\/a>.<\/p>\n\n\n\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Auf Kotlin 1.6.0 aktualisieren\" href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/\/#how-to-install\">Auf Kotlin 1.6.0 aktualisieren<\/a><\/p>\n\n\n\n<h1 id=\"language-features\">Sprachmerkmale<\/h1>\n\n\n\n<p>Wir haben Sprachmerkmale aus Kotlin 1.5.30 basierend auf Ihrem Feedback stabilisiert.<\/p>\n\n\n\n<h2>Abschlie\u00dfende (versiegelte) <code>when<\/code>-Anweisungen<\/h2>\n\n\n\n<p>Versiegeltes <code>when<\/code> ist eine <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-12380\" target=\"_blank\" rel=\"noopener\">lang erwartete<\/a> Funktion des Kotlin-Compilers, die Sie warnt, wenn Ihre when-Anweisungen nicht abschlie\u00dfend sind, also nicht alle M\u00f6glichkeiten ber\u00fccksichtigen. Dadurch wird Ihr Code sicherer, ohne eigene Funktionen f\u00fcr diesen Zweck schreiben zu m\u00fcssen.&nbsp;<\/p>\n\n\n\n<p>Kotlin hat <code>when<\/code><em><\/em>-Ausdr\u00fccke, die sich auf versiegelte Klassen, Enums und boolesche Typen bezogen, schon immer auf Vollst\u00e4ndigkeit \u00fcberpr\u00fcft. Dies ist n\u00fctzlich, wenn Sie Ihre Dom\u00e4ne mit diesen algebraischen Datentypen abbilden. Sie k\u00f6nnten beispielsweise in Ihrer App unterschiedliche Kontaktpr\u00e4ferenzen der Benutzer*innen als versiegelte Klassenhierarchie modellieren:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nsealed class Contact {\n   data class PhoneCall(val number: String) : Contact()\n   data class TextMessage(val number: String) : Contact()\n   data class InstantMessage(val type: IMType, val user: String) : Contact()\n}\n<\/pre>\n\n\n\n<p>Wenn Sie nun einen Ausdruck schreiben, der abh\u00e4ngig von der Kontakteinstellung ein unterschiedliches Ergebnis zur\u00fcckgibt, meldet der Compiler einen Fehler, wenn Sie vergessen haben, alle Typen zu ber\u00fccksichtigen, die in Ihrer App m\u00f6glich sind:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun Rates.computeMessageCost(contact: Contact): Cost =\n   when (contact) { \/\/ ERROR: 'when' expression must be exhaustive\n       is Contact.PhoneCall -&gt; phoneCallCost\n       is Contact.TextMessage -&gt; textMessageCost\n   }\n<\/pre>\n\n\n\n<p>Dies ist eine gro\u00dfe Hilfe sowohl beim Schreiben des Codes als auch bei der sp\u00e4teren Wartung. Wenn Sie sp\u00e4ter eine weitere Kontaktoption hinzuf\u00fcgen, k\u00f6nnen Sie sich darauf verlassen, dass der Compiler Sie daran erinnert, die verschiedenen Kontaktpr\u00e4ferenzen \u00fcberall in Ihrem Code zu ber\u00fccksichtigen.<\/p>\n\n\n\n<p>Vor Kotlin 1.6 wurde jedoch die <code>when<\/code><em>-Anweisung<\/em> im folgenden Code erfolgreich kompiliert, obwohl vers\u00e4umt wurde, den Versand einer Nachricht per Instant Messaging zu implementieren:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun sendAnnouncement(contact: Contact, announcement: Announcement) {\n   when (contact) {\n       is Contact.PhoneCall -&gt; schedulePhoneCall(contact.number, announcement)\n       is Contact.TextMessage -&gt; sendTextMessage(contact.number, announcement)\n   }\n}\n<\/pre>\n\n\n\n<p>Das Problem wurde nur von einer nachrangigen IDE-Inspektion gemeldet, ohne irgendwelche Meldungen vom Compiler. Ab Kotlin 1.6 wird die folgende Compiler-Warnung ausgegeben:<\/p>\n\n\n\n<p><code>Non-exhaustive 'when' statements on sealed class\/interface will be prohibited in 1.7. Add an 'is InstantMessage' branch or 'else' branch instead.<\/code><\/p>\n\n\n\n<p>In Kotlin 1.7 wird dies als Fehler gewertet, damit solche F\u00e4lle nicht \u00fcbersehen werden k\u00f6nnen. Im Ticket <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-47709\" target=\"_blank\" rel=\"noopener\">KT-47709<\/a> finden Sie eine genauere Erl\u00e4uterung der \u00c4nderung und ihrer Auswirkungen.&nbsp;<\/p>\n\n\n\n<h2>Suspendierende Funktionen als Supertypen<\/h2>\n\n\n\n<p>Kotlin 1.6 stabilisiert die Unterst\u00fctzung f\u00fcr die Implementierung von <code>suspend<\/code>-Funktionstypen als Superschnittstellen. Dies war eines der fehlenden Puzzleteile beim Design der Kotlin-Coroutinen.&nbsp;<\/p>\n\n\n\n<p>Bei der Gestaltung von Kotlin-APIs ist es idiomatisch, Funktionstypen zu akzeptieren, wenn das Verhalten von Bibliotheksfunktionen anpassbar sein soll. Beispielsweise verf\u00fcgt die Schnittstelle <code>Job<\/code> der API <code>kotlinx.coroutines<\/code> \u00fcber eine Memberfunktion, die ungef\u00e4hr so aussieht:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun invokeOnCompletion(handler: () -&gt; Unit)\n<\/pre>\n\n\n\n<p>Sie k\u00f6nnen diese Funktion bequem mit Lambdas wie <code><em>nachAbschlussAufrufen <\/em><strong>{ <\/strong><em>etwasTun<\/em>() <strong>}<\/strong><\/code> verwenden. Wenn Sie eine Klasse haben, die auf den Abschluss reagieren soll, k\u00f6nnen Sie Ihren Code vereinfachen und optimieren, indem Sie den Funktionstyp <code>() -&gt; Unit<\/code> direkt in Ihrer Klasse implementieren, sodass Sie keine zus\u00e4tzliche Lambdafunktion ben\u00f6tigen:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nclass MyCompletionHandler : () -&gt; Unit {\n   override fun invoke() { doSomething() }\n}\n<\/pre>\n\n\n\n<p>Ab Kotlin 1.6 ist diese Optimierung mit suspendierenden Funktionen m\u00f6glich. Nehmen wir an, Ihre API akzeptiert suspendierende Funktionstypen wie diese:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\npublic fun launchOnClick(action: suspend () -&gt; Unit) {}\n<\/pre>\n\n\n\n<p>In diesem Fall sind Sie nicht mehr darauf beschr\u00e4nkt, Lambdas und Referenzen auf suspendierende Funktionen an diesen Code zu \u00fcbergeben. Sie k\u00f6nnen die entsprechenden suspendierenden Funktionstypen auch in einer Klasse implementieren:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nclass MyClickAction : suspend () -&gt; Unit {\n   override suspend fun invoke() { doSomething() }\n}\n<\/pre>\n\n\n\n<h2>Umwandlungen in suspendierende Typen<\/h2>\n\n\n\n<p>Kotlin 1.6 bef\u00f6rdert die Umwandlungen von regul\u00e4ren zu suspendierenden Funktionstypen in den stabilen Status. Wenn bei einem Parameter ein suspendierender Typ erwartet wird, k\u00f6nnen Sie jetzt einen geeigneten regul\u00e4ren Funktionstyp \u00fcbergeben. Der Compiler f\u00fchrt die Umwandlung automatisch durch.<\/p>\n\n\n\n<p>Dadurch wird eine kleine, aber st\u00f6rende Inkonsistenz beim Zusammenspiel zwischen regul\u00e4ren und suspendierenden Funktionen in Kotlin behoben. Wenn Sie eine Funktion h\u00f6herer Ordnung haben, die eine suspendierende Funktion akzeptiert (Beispiel: ein <a href=\"https:\/\/kotlin.github.io\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines.flow\/collect.html\" target=\"_blank\" rel=\"noopener\">collect<\/a>-Aufruf auf einem Kotlin-Flow), m\u00fcssen Sie zum Aufrufen nicht unbedingt ein Lambda wie im folgenden Code verwenden:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nflow.collect { processItem(it) }\n<\/pre>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun processItem(item: Item) { \/* ... *\/ }\n<\/pre>\n\n\n\n<p>Stattdessen k\u00f6nnte es praktischer sein, eine Referenz auf die Funktion <code>processItem<\/code> an den <code>collect<\/code>-Aufruf zu \u00fcbergeben \u2013 die Wirkung ist identisch.<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nflow.collect(::processItem)\n<\/pre>\n\n\n\n<p>Sie k\u00f6nnten dann eine Referenz auf Ihre Verarbeitungsfunktion in eine Variable extrahieren, um das Verhalten in Ihrem Code entsprechend anzupassen. Allerdings funktionierte dies in den Kotlin-Versionen vor 1.6 nicht. Dies liegt daran, dass Sie eine regul\u00e4re Funktion als Parameter \u00fcbergeben, wo ein suspendierender Typ erwartet wird:<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nval processingFunction = ::processItem\nflow.collect(processingFunction) \/\/ ERROR: Type mismatch\n<\/pre>\n\n\n\n<p>Der obige Code wird in Kotlin 1.6 einwandfrei kompiliert und funktioniert auch wie erwartet.<\/p>\n\n\n\n<h2>Verbesserte Typinferenz f\u00fcr rekursive generische Typen<\/h2>\n\n\n\n<p>Ab 1.6.0 kann der Kotlin-Compiler standardm\u00e4\u00dfig ein Typargument basierend nur auf den oberen Grenzen des entsprechenden Typparameters ableiten, wenn dieser ein rekursiver generischer Typ ist. Dies erm\u00f6glicht verschiedene Patterns mit rekursiven generischen Typen, die in Java h\u00e4ufig f\u00fcr Builder-APIs verwendet werden.<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n\/\/ Vor 1.5.30\nval containerA = PostgreSQLContainer&lt;nothing&gt;(DockerImageName.parse(&quot;postgres:13-alpine&quot;)).apply {\n    withDatabaseName(&quot;db&quot;)\n    withUsername(&quot;user&quot;)\n    withPassword(&quot;password&quot;)\n    withInitScript(&quot;sql\/schema.sql&quot;)\n}\n\n\/\/ Mit Compileroption in 1.5.30 oder standardm\u00e4\u00dfig ab 1.6.0\nval containerB = PostgreSQLContainer(DockerImageName.parse(&quot;postgres:13-alpine&quot;))\n    .withDatabaseName(&quot;db&quot;)\n    .withUsername(&quot;user&quot;)\n    .withPassword(&quot;password&quot;)\n    .withInitScript(&quot;sql\/schema.sql&quot;)\n<\/pre><\/nothing>\n\n\n\n<h2>Verbesserte Builder-Inferenz<\/h2>\n\n\n\n<p>In Kotlin 1.5.30 wurde die Compileroption <code>-Xunrestricted-builder-inference<\/code> eingef\u00fchrt, um innerhalb von Builder-Lambdas auf Typinformationen \u00fcber einen Builder-Aufruf zugreifen zu k\u00f6nnen. Konkret bedeutet dies die M\u00f6glichkeit, Aufrufe zu t\u00e4tigen, die eine Instanz eines noch nicht bekannten Typs zur\u00fcckgeben, z.\u00a0B. <code>get()<\/code> in einem <code>buildList()<\/code>-Lambda.<\/p>\n\n\n\n<p>Ab 1.6.0 m\u00fcssen Sie nicht die Option <code>-Xunrestricted-builder-inference<\/code> angeben, um diese bisher unzul\u00e4ssigen Aufrufe zu t\u00e4tigen. Mit der Compileroption <code>-Xenable-builder-inference<\/code> k\u00f6nnen Sie jetzt ohne Verwendung der Annotation <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/-builder-inference\/\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>@BuilderInference<\/code><\/a> Ihre eigenen generischen Builder schreiben und Builder-Inferenzen automatisch aktivieren, wenn die regul\u00e4re Typinferenz keine Typinformationen ergibt.<\/p>\n\n\n\n<h2>L\u00e4ngere Unterst\u00fctzung fr\u00fcherer API-Versionen<\/h2>\n\n\n\n<p>Ab Kotlin 1.6.0 k\u00f6nnen Sie bei der Entwicklung au\u00dfer der aktuellen stabilen API-Version drei fr\u00fchere Versionen (anstelle der bisherigen zwei) verwenden. Derzeit stehen Ihnen also die API-Versionen 1.3, 1.4, 1.5 und 1.6 zur Verf\u00fcgung.<\/p>\n\n\n\n<h1 id=\"jvm\">Kotlin\/JVM<\/h1>\n\n\n\n<p><strong>Wiederholbare Annotationen mit Laufzeiterhaltung.<\/strong><em> <\/em>Wie <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/annotations\/repeating.html\" target=\"_blank\" rel=\"noopener\">Java 8<\/a> kennt auch Kotlin wiederholbare Annotationen. Ab Kotlin 1.6 ist diese Funktion Java-kompatibel. <code>@kotlin.annotation.Repeatable<\/code> akzeptiert jetzt jede Retention-Angabe und macht die Annotation sowohl in Kotlin als auch in Java wiederholbar. Au\u00dferdem werden wiederholbare Java-Annotationen jetzt auch auf Kotlin-Seite unterst\u00fctzt.<\/p>\n\n\n\n<h1 id=\"native\">Kotlin\/Native<\/h1>\n\n\n\n<p>Ab sofort k\u00f6nnen Sie die experimentelle Version des neuen <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/try-the-new-kotlin-native-memory-manager-development-preview\/\"><strong>Kotlin\/Native-Speichermanagers<\/strong><\/a> ausprobieren. Mit diesem Feature kommen wir unserem Ziel einer konsistenten Entwicklererfahrung bei Multiplattform-Projekten n\u00e4her. Der neue Speichermanager hebt die bestehenden Beschr\u00e4nkungen f\u00fcr die gemeinsame Objektnutzung zwischen Threads auf und bietet Primitive f\u00fcr die nebenl\u00e4ufige Programmierung, die sicher sind, Lecks vermeiden und keine spezielle Verwaltung oder Annotationen von Seiten des Entwicklungsteams erfordern.<\/p>\n\n\n\n<p>Sie k\u00f6nnen Xcode unbesorgt aktualisieren und an Ihren Kotlin-Projekten weiterarbeiten, da Kotlin\/Native jetzt <strong>Xcode 13<\/strong> unterst\u00fctzt.&nbsp;<\/p>\n\n\n\n<p><strong>Kompilieren von Windows-Zielen auf beliebigen Hosts.<\/strong> Sie k\u00f6nnen die Windows-Ziele <code>mingwX64<\/code> und <code>mingwX86<\/code> auf jedem Host kompilieren, der Kotlin\/Native unterst\u00fctzt.<\/p>\n\n\n\n<p>Wir haben die <strong>LLVM-Abh\u00e4ngigkeit<\/strong>, die Kotlin\/Native unter der Haube verwendet, \u00fcberarbeitet. Neben einer auf 11.1.0 aktualisierten LLVM-Version und einer verringerten Gr\u00f6\u00dfe der Abh\u00e4ngigkeiten bietet dies einige weitere Vorteile.<\/p>\n\n\n\n<p><strong>Vereinheitlichung der Compiler-Plugin-ABI mit den JVM- und JS-IR-Backends<\/strong>. Jetzt kann das Gradle-Plugin f\u00fcr Kotlin Multiplatform das einbettbare Compiler-Jar, das f\u00fcr die JVM- und JS-IR-Backends verwendet wird, auch f\u00fcr Kotlin\/Native verwenden. Sie k\u00f6nnen jetzt dieselben Compiler-Plugin-Artefakte f\u00fcr die Native-Plattform und andere unterst\u00fctzte Plattformen verwenden.<\/p>\n\n\n\n<h1 id=\"js\">Kotlin\/JS<\/h1>\n\n\n\n<p>F\u00fcr Buildvorg\u00e4nge auf einem Server ohne Internetverbindung k\u00f6nnen Sie jetzt das Herunterladen von Node.js und Yarn f\u00fcr Kotlin\/JS-Projekte deaktivieren und die auf dem Host vorinstallierten Instanzen verwenden.<\/p>\n\n\n\n<h1 id=\"kover\">Kover<\/h1>\n\n\n\n<p>Die genaue Ermittlung der Code-Coverage war vom ersten Kotlin-Release an eine Herausforderung. Einige gro\u00dfartige Tools wie JaCoCo verarbeiten Kotlin-Code, sind jedoch nicht vollst\u00e4ndig in unsere Gradle-Toolchain und unsere Multiplattform-Projekte integriert. In dieser Kotlin-Version haben wir begonnen, dieses Problem anzupacken. Unser neues Gradle-Plugin Kover ermittelt die Code-Coverage von Kotlin-Code, der mit dem Kotlin\/JVM-Compiler kompiliert wurde. Das Tool befindet es sich in einer fr\u00fchen Entwicklungsphase und gilt als experimentell \u2013 wir freuen uns auf Ihr Feedback in <a href=\"https:\/\/github.com\/Kotlin\/kotlinx-kover\/issues\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>.<\/p>\n\n\n\n<p><a href=\"https:\/\/youtu.be\/jNu5LY9HIbw\" target=\"_blank\" rel=\"noopener\">Sehen Sie sich das Kover-Video an, um mehr zu erfahren<\/a>.<\/p>\n\n\n\n<h1 id=\"standard-library\">Standardbibliothek<\/h1>\n\n\n\n<p>Kotlin 1.6.0 schlie\u00dft drei Eintr\u00e4ge auf der stdlib-Roadmap: <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46785\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">kein <code>!!<\/code> nach <code>readLine()<\/code><\/a>, <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-45396\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">stabiler Status f\u00fcr <code>typeOf()<\/code><\/a> und <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46784\" target=\"_blank\" rel=\"noopener\">eine stabile Duration-API<\/a>. Au\u00dferdem erhalten die folgenden stdlib-Elemente den Status <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Stable<\/a>:<\/p>\n\n\n\n<ul><li>Collection-Builder<\/li><li>Bit-Rotation bei Ganzzahlen<\/li><li>Regex-Funktion zum Aufteilen von Zeichenfolgen in Sequenzen<\/li><\/ul>\n\n\n\n<p>Au\u00dferdem k\u00f6nnen Sie jetzt <code>compareTo<\/code> mit Infixnotation verwenden, und wir haben an der Konsistenz zwischen den <code>replace()<\/code>-Funktionen in JVM und JS gearbeitet.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u00c4nderungen an der Standardbibliothek in Kotlin 1.6\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/GWWFCyfNGFs?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2>Neue Funktionen f\u00fcr die Standardeingabe<\/h2>\n\n\n\n<p>In Kotlin 1.6.0 ist der Nicht-Null-Assertion-Operator <code>!!<\/code> nach dem Lesen einer Zeile von der Standardeingabe nicht mehr erforderlich. Dies vereinfacht den Einstieg f\u00fcr Neulinge und erleichtert das Unterrichten von Kotlin.<\/p>\n\n\n\n<p>Wir bieten die folgenden neuen M\u00f6glichkeiten f\u00fcr das Lesen von der Konsole:<\/p>\n\n\n\n<ul><li><code>readln()<\/code> l\u00f6st eine Ausnahme aus, wenn das Dateiende erreicht wurde. Sie k\u00f6nnen diese Funktion verwenden, statt das Ergebnis von <code>readLine()<\/code> mit dem Operator <code>!!<\/code> auf <code>null<\/code> zu \u00fcberpr\u00fcfen.<\/li><li>Die neue Funktion <code>readlnOrNull()<\/code> ist eine Alternative, die <code>null<\/code> zur\u00fcckgibt. Sie verh\u00e4lt sich also wie bisher <code>readLine()<\/code> \u2013 nur dass die Funktion jetzt einen passenderen Namen hat.<\/li><\/ul>\n\n\n\n<p>Diese Funktionen sind f\u00fcr JVM und Native verf\u00fcgbar. Sie sind analog zu <code>println()<\/code> benannt \u2013 f\u00fcr Neueinsteiger*innen ist dies besonders hilfreich.<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n    println(&quot;Input two integer numbers each on a separate line&quot;)\n    val num1 = readln().toInt()\n    val num2 = readln().toInt()\n    println(&quot;The sum of $num1 and $num2 is ${num1 + num2}&quot;)\n}\n<\/pre>\n\n\n\n<h2>Stabile Duration-API<\/h2>\n\n\n\n<p>Mithilfe Ihres Feedbacks haben wir die API f\u00fcr Zeitr\u00e4ume stabilisiert und den entsprechenden <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46784\" target=\"_blank\" rel=\"noopener\">Roadmap-Eintrag geschlossen<\/a>.<\/p>\n\n\n\n<p>Neben einer besser lesbaren Ausgabe von <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/to-string.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>Duration.toString()<\/code><\/a> und <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1530.html#standard-library\" target=\"_blank\" rel=\"noopener\">neuen Funktionen zum Parsen von Durations aus Strings<\/a>, die in 1.5.30 als Preview verf\u00fcgbar waren, hat die Duration-API folgende \u00c4nderungen erfahren:<\/p>\n\n\n\n<ul><li>Die <code>days<\/code>-Komponente der Funktion <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/to-components.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>toComponents<\/code><\/a> ist jetzt vom Typ <code>Long<\/code> statt <code>Int<\/code>, um das Abschneiden von Werten zu vermeiden.<\/li><li>Die Enum <em><code>DurationUnit<\/code> <\/em>ist kein Typalias mehr. Es gibt keine F\u00e4lle, in denen es als Typalias f\u00fcr <em><code>Java.util.concurrent.TimeUnit<\/code><\/em> in der JVM verwendet wird.<\/li><li>Als Wunsch der Community sind Erweiterungseigenschaften wie <code>Int.seconds<\/code> wieder da. Um ihre Anwendbarkeit einzuschr\u00e4nken, sind sie nur im Companion-Objekt der Klasse Duration verf\u00fcgbar.<\/li><\/ul>\n\n\n\n<pre class=\"kotlin-code\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport kotlin.time.Duration.Companion.seconds\n\nfun main() {\n\/\/sampleStart\n    val duration = 5000.seconds\n    println(&quot;There are ${duration.inWholeMinutes} minutes in ${duration.inWholeHours} hours&quot;)\n\/\/sampleEnd\n}\n<\/pre>\n\n\n\n<h2>Stabiles <code>typeOf()<\/code><\/h2>\n\n\n\n<p>In Kotlin 1.6.0 hat <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/type-of.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>typeOf()<\/code><\/a> den Status <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">Stable<\/a>. Der entsprechende <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-45396\" target=\"_blank\" rel=\"noopener\">Roadmap-Eintrag wurde geschlossen<\/a>. <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/06\/kotlin-1-3-40-released\/\">Seit 1.3.40<\/a> war <code>typeOf()<\/code> auf der JVM-Plattform als experimentelle API verf\u00fcgbar. Jetzt ist die Funktion auf jeder Kotlin-Plattform verf\u00fcgbar und gibt einen beliebigen Kotlin-Typ, den der Compiler ableiten kann, als <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/-k-type\/#kotlin.reflect.KType\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>KType<\/code><\/a> zur\u00fcck.&nbsp;<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\ninline fun &lt;reified T&gt; renderType(): String {\n    val type = typeOf&lt;T&gt;()\n    return type.toString()\n}\n\nfun main() {\n    val fromExplicitType = typeOf&lt;Int&gt;()\n    val fromReifiedType = renderType&lt;List&lt;Int&gt;&gt;()\n}\n<\/pre>\n\n\n\n<h2>Stabile Collection-Builder<\/h2>\n\n\n\n<p>Kotlin 1.6.0 bef\u00f6rdert Collection-Builder-Funktionen wie <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-map.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>buildMap()<\/code><\/a>, <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-list.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>buildList()<\/code><\/a> und <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-set.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>buildSet()<\/code><\/a> in den <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">Stable<\/a>-Status. Von den Buildern zur\u00fcckgegebene Collections sind jetzt im schreibgesch\u00fctzten Zustand serialisierbar.<\/p>\n\n\n\n<h2>Stabile Bitrotation f\u00fcr Ganzzahlen<\/h2>\n\n\n\n<p>Die Funktionen <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/rotate-left.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>rotateLeft()<\/code><\/a> und <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/rotate-right.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>rotateRight()<\/code><\/a>, die die bin\u00e4re Darstellung einer Zahl um die angegebene Anzahl von Bits nach links oder rechts rotieren, haben ab Kotlin 1.6.0 den Status <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Stable<\/a>.<\/p>\n\n\n\n<pre class=\"kotlin-code\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n\/\/sampleStart\n    val number: Short = 0b10001\n    println(number.rotateRight(2).toString(radix = 2)) \/\/ 100000000000100\n    println(number.rotateLeft(2).toString(radix = 2))  \/\/ 1000100\n\/\/sampleEnd\n}\n<\/pre>\n\n\n\n<h2>Stabile Regex-Funktion zum Aufteilen von Zeichenfolgen in Sequenzen<\/h2>\n\n\n\n<p>Eine weitere seit Kotlin 1.6.0 stabile Funktion ist <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/split-to-sequence.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>splitToSequence()<\/code><\/a> zum Aufteilen einer Zeichenfolge in eine Sequenz mithilfe eines regul\u00e4ren Ausdrucks.<\/p>\n\n\n\n<pre class=\"kotlin-code\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main(){\n\/\/sampleStart\n    val colorsText = &quot;green, red , brown&amp;blue, orange, pink&amp;green&quot;\n    val regex = &quot;[,\\\\s]+&quot;.toRegex()\n    val mixedColor = regex.splitToSequence(colorsText)\n        .onEach { println(it) }\n        .firstOrNull { it.contains('&amp;') }\n    println(mixedColor) \/\/ &quot;brown&amp;blue&quot;\n\/\/sampleEnd\n}\n<\/pre>\n\n\n\n<h2>CompareTo in Infixnotation<\/h2>\n\n\n\n<p>Die Funktion <code>Comparable.compareTo<\/code> zum Vergleichen von zwei Objekten kann jetzt in Infixnotation aufgerufen werden:&nbsp;<\/p>\n\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nclass WrappedText(val text: String) : Comparable&lt;WrappedText&gt; {\n    override fun compareTo(other: WrappedText): Int =\n        this.text compareTo other.text\n}\n<\/pre>\n\n\n\n<h2>Einheitlichkeit zwischen JVM und JS bei replace() und replaceFirst()<\/h2>\n\n\n\n<p>Vor Kotlin 1.6.0 verhielten sich die Regex-Funktionen <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/replace.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>replace()<\/code><\/a> und <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/replace-first.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\"><code>replaceFirst()<\/code><\/a> auf JVM und JS unterschiedlich, wenn die Ersetzungszeichenfolge eine Gruppenreferenz enthielt. Das Verhalten von Kotlin\/JS wurde an das Verhalten der JVM angepasst.<\/p>\n\n\n\n<h1 id=\"compatibility\">Kompatibilit\u00e4t<\/h1>\n\n\n\n<p>Wie bei allen Feature-Releases werden mit Kotlin 1.6.0 einige Deprecation-Zyklen f\u00fcr zuvor angek\u00fcndigte \u00c4nderungen abgeschlossen. Alle diese F\u00e4lle wurden vom Sprachkomitee sorgf\u00e4ltig gepr\u00fcft und sind im <a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\">Kompatibilit\u00e4tsleitfaden f\u00fcr Kotlin 1.6<\/a> aufgef\u00fchrt. Sie k\u00f6nnen diese \u00c4nderungen auch in YouTrack einsehen.<\/p>\n\n\n\n<h1 id=\"how-to-install\">Installation von Kotlin 1.6.0<\/h1>\n\n\n\n<p>Wenn Sie <a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> oder <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> verwenden, schl\u00e4gt Ihnen die IDE automatisch die Aktualisierung auf Kotlin 1.6.0 vor. Alternativ ist auch eine manuelle Aktualisierung gem\u00e4\u00df <a href=\"https:\/\/kotlinlang.org\/docs\/releases.html#update-to-a-new-release\" target=\"_blank\" rel=\"noopener\">dieser Anleitung<\/a> m\u00f6glich.<\/p>\n\n\n\n<p>Sie k\u00f6nnen die neuesten Versionen dieser IDEs herunterladen, um eine umfassende Kotlin-Unterst\u00fctzung zu erhalten:<\/p>\n\n\n\n<ul><li><a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> \u2013 zur Entwicklung von Kotlin-Anwendungen f\u00fcr verschiedene Plattformen.<\/li><li><a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> \u2013 zur Entwicklung von Android-Apps und plattform\u00fcbergreifenden Mobilanwendungen.<\/li><\/ul>\n\n\n\n<p>Achten Sie darauf, auch die kotlinx-Bibliotheken auf die <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">kompatiblen Versionen<\/a> zu aktualisieren und die Kotlin-Version 1.6.0 in den Build-Skripten Ihrer bestehenden Projekte anzugeben.<\/p>\n\n\n\n<p>Den Befehlszeilen-Compiler k\u00f6nnen Sie bei Bedarf von der <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.6.0\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">GitHub-Release-Seite<\/a> herunterladen.<\/p>\n\n\n\n<h3>Hilfe bei Problemen:<\/h3>\n\n\n\n<ul><li>Holen Sie sich Unterst\u00fctzung auf <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (eine <a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">Einladung erhalten Sie hier<\/a>).<\/li><li>Melden Sie Probleme in unserem Issue-Tracker, <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/li><\/ul>\n\n\n\n<div style=\"background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; text-align: left; min-height: px;\">\n<p>Bleiben Sie stets auf dem neuesten Stand der Kotlin-Entwicklung! Abonnieren Sie unsere Kotlin-Updates, indem Sie das Formular rechts neben diesem Beitrag ausf\u00fcllen.<\/p>\n<\/div>\n\n\n\n<h1>Weitere Informationen zum Lesen und Ansehen<\/h1>\n\n\n\n<ul><li><a href=\"https:\/\/kotlinlang.org\/docs\/roadmap.html\" target=\"_blank\" rel=\"noopener\">Kotlin-Roadmap<\/a><\/li><li><a href=\"https:\/\/youtu.be\/jNu5LY9HIbw\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Kover \u2013 das Code-Coverage-Plugin<\/a><\/li><li><a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew16.html\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Das ist neu in Kotlin 1.6.0 (Dokumentation)<\/a><\/li><li><a href=\"https:\/\/youtu.be\/6jrmcfYdfvI\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Das ist neu in Kotlin 1.6.0 (YouTube-Video)<\/a><\/li><li><a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\">Kompatibilit\u00e4tsleitfaden f\u00fcr Kotlin 1.6<\/a><\/li><li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/kotlin-1-5-30-released\/\">Kotlin 1.5.30 ist jetzt verf\u00fcgbar!<\/a><\/li><\/ul>\n\n\n\n<h1>Liste der aktivsten Ticketersteller in YouTrack&nbsp;<\/h1>\n\n\n\n<p><a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20rnett\" target=\"_blank\" rel=\"noopener\">Ryan Nett<\/a> (48 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20hzsweers\" target=\"_blank\" rel=\"noopener\">Zac Sweers<\/a> (22 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20tgeng\" target=\"_blank\" rel=\"noopener\">Tianyu Geng<\/a> (18 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20zhelenskiy.1\" target=\"_blank\" rel=\"noopener\">zhelenskiy<\/a> (18 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20theosotr\" target=\"_blank\" rel=\"noopener\">Thodoris Sotiropoulos<\/a> (15 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20lblb636\" target=\"_blank\" rel=\"noopener\">AndroidDeveloperLB<\/a> (14 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20kotlinisland\" target=\"_blank\" rel=\"noopener\">Morgan, Bartholomew<\/a> (14 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20Mikhail.Naftal\" target=\"_blank\" rel=\"noopener\">Mikhail Naftal<\/a> (14 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20louis.cad\" target=\"_blank\" rel=\"noopener\">Louis CAD<\/a> (12 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20hfhbd\" target=\"_blank\" rel=\"noopener\">Philip Wedemann<\/a> (12 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20Turansky\" target=\"_blank\" rel=\"noopener\">Victor Turansky<\/a> (11 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20panell\" target=\"_blank\" rel=\"noopener\">Igor Wojda<\/a> (11 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20martinbonnin\" target=\"_blank\" rel=\"noopener\">Martin Bonnin<\/a> (11 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20postovalovya\" target=\"_blank\" rel=\"noopener\">Iaroslav Postovalov<\/a> (11 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20Fruxz\" target=\"_blank\" rel=\"noopener\">Cedric<\/a> (10 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20RinOrz\" target=\"_blank\" rel=\"noopener\">\u51db<\/a> (9 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20benwoodworth\" target=\"_blank\" rel=\"noopener\">Ben Woodworth<\/a> (8 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20him188\" target=\"_blank\" rel=\"noopener\">Tianyi Guan<\/a> (8 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20beigetangerine\" target=\"_blank\" rel=\"noopener\">Chris Povirk<\/a> (8 Tickets), <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/?q=project:KT,%20KTIJ%20created:%202021-05-05%20..%20*%20created%20by:%20aalbert\" target=\"_blank\" rel=\"noopener\">Alon Albert<\/a> (8 Tickets).<\/p>\n\n\n\n<h1>Externe Mitwirkende<\/h1>\n\n\n\n<p>Wir bedanken uns bei allen Mitwirkenden, die Pull-Requests zu dieser Version beigetragen haben: <a href=\"https:\/\/github.com\/pyos\" target=\"_blank\" rel=\"noopener\">Pyos<\/a>, <a href=\"https:\/\/github.com\/tgeng\" target=\"_blank\" rel=\"noopener\">Tianyu Geng<\/a>, <a href=\"https:\/\/github.com\/jsjeon\" target=\"_blank\" rel=\"noopener\">Jinseong Jeon<\/a>, <a href=\"https:\/\/github.com\/sfs\" target=\"_blank\" rel=\"noopener\">Steven Sch\u00e4fer<\/a>, <a href=\"https:\/\/github.com\/punzki\" target=\"_blank\" rel=\"noopener\">Mark Punzalan<\/a>, <a href=\"mailto:hungnv@google.com\">Hung Nguyen<\/a>, <a href=\"https:\/\/github.com\/madsager\" target=\"_blank\" rel=\"noopener\">Mads Ager<\/a>, <a href=\"https:\/\/github.com\/ting-yuan\" target=\"_blank\" rel=\"noopener\">Ting-Yuan Huang<\/a>, <a href=\"https:\/\/github.com\/gharrma\" target=\"_blank\" rel=\"noopener\">Matthew Gharrity<\/a>,<a href=\"https:\/\/github.com\/lunakoly\" target=\"_blank\" rel=\"noopener\"> <\/a><a href=\"https:\/\/github.com\/gavra0\" target=\"_blank\" rel=\"noopener\">Ivan Gavrilovic<\/a>, <a href=\"https:\/\/github.com\/scaventz\" target=\"_blank\" rel=\"noopener\">Xin Wang<\/a>, <a href=\"https:\/\/github.com\/ov7a\" target=\"_blank\" rel=\"noopener\">ov7a<\/a>, <a href=\"https:\/\/github.com\/neetopia\" target=\"_blank\" rel=\"noopener\">Jiaxiang Chen<\/a>, <a href=\"https:\/\/github.com\/yigit\" target=\"_blank\" rel=\"noopener\">Yigit Boyar<\/a>, <a href=\"https:\/\/github.com\/bingranl\" target=\"_blank\" rel=\"noopener\">Bingran<\/a>, <a href=\"https:\/\/github.com\/bracadabra\" target=\"_blank\" rel=\"noopener\">bracadabra<\/a>, <a href=\"mailto:stumpos@fb.com\" class=\"ek-link\">Steffi Stumpos<\/a>, <a href=\"https:\/\/github.com\/akuleshov7\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">Andrey Kuleshov<\/a>.<\/p>\n\n\n\n<p>Autorin des Original-Blogposts:<\/p>\n\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1132,"featured_media":202896,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/218774"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/1132"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=218774"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/218774\/revisions"}],"predecessor-version":[{"id":218805,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/kotlin\/218774\/revisions\/218805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/202896"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=218774"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=218774"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=218774"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=218774"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}