{"id":215756,"date":"2021-11-16T15:46:00","date_gmt":"2021-11-16T14:46:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/11\/kotlin-1-6-0-is-released\/"},"modified":"2021-12-29T15:01:18","modified_gmt":"2021-12-29T14:01:18","slug":"publication-de-kotlin-1-6-0","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/","title":{"rendered":"Publication de Kotlin 1.6.0"},"content":{"rendered":"<p>Kotlin 1.6.0 est maintenant officiellement disponible et apporte notamment la stabilisation des expressions <code>when<\/code> exhaustives, ainsi que l&#8217;ajout du plugin Kover et d&#8217;un nouveau gestionnaire de m\u00e9moire pour Kotlin\/Native. D&#8217;autres fonctionnalit\u00e9s du langage et de la biblioth\u00e8que standard publi\u00e9es dans la version 1.5.30 sont \u00e9galement pass\u00e9es au stade <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">stable<\/a>. Merci pour tous les retours que vous avez partag\u00e9s avec nous. Si vous n&#8217;avez pas encore essay\u00e9 ces nouvelles fonctionnalit\u00e9s, c&#8217;est le moment !<\/p>\n<p>Cet article pr\u00e9sente les nouveaut\u00e9s suivantes :<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#language-features\"><strong>Fonctionnalit\u00e9s du langage<\/strong><\/a> : instructions when scell\u00e9es, fonctions et conversions suspensives, instanciation des classes d&#8217;annotation, am\u00e9lioration de l&#8217;inf\u00e9rence de type standard et de l&#8217;inf\u00e9rence de type de g\u00e9n\u00e9rateur.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#jvm\"><strong>Kotlin\/JVM<\/strong><\/a> : propri\u00e9t\u00e9s d\u00e9l\u00e9gu\u00e9es optimis\u00e9es et annotations reproductibles.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#native\"><strong>Kotlin\/Native<\/strong><\/a> : aper\u00e7u du nouveau mod\u00e8le de gestion de la m\u00e9moire, prise en charge de Xcode 13, compilation crois\u00e9e des cibles Windows, mise \u00e0 jour de LLVM et de l&#8217;\u00e9diteur de liens, am\u00e9lioration des performances et ABI des plugins du compilateur unifi\u00e9e.<\/li>\n<li>Possibilit\u00e9 de d\u00e9sactiver le t\u00e9l\u00e9chargement de Node.js et de Yarn pour <a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#js\"><strong>Kotlin\/JS<\/strong><\/a>.<\/li>\n<li>L&#8217;annonce de <a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#kover\"><strong>Kover<\/strong><\/a>.<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#kover\"><strong>Biblioth\u00e8que standard<\/strong><\/a> : nouvelles fonctions pour l&#8217;entr\u00e9e standard, fonction <code>typeOf()<\/code> et API Duration stables, stabilisation d&#8217;autres fonctions stdlib.<\/li>\n<\/ul>\n<p>\u00a0<\/p>\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\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Nouveaut\u00e9s de Kotlin 1.6.0\" src=\"https:\/\/www.youtube.com\/embed\/6jrmcfYdfvI?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<p><a href=\"https:\/\/info.jetbrains.com\/kotlin-communication-center-page.html\" target=\"_blank\" rel=\"noopener\"><strong><em>Abonnez-vous<\/em><\/strong><\/a><strong><em> <strong><em>\u00e0 notre blog pour ne plus manquer aucune des mises \u00e0 jour de Kotlin<\/em><\/strong><\/em><\/strong><\/p>\n<h1>Comment faire la mise \u00e0 jour<\/h1>\n<p>Si vous utilisez <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/#section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> ou <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>, vous pouvez choisir la mise \u00e0 jour automatique de Kotlin.<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Mise \u00e0 jour vers Kotlin 1.6.0\" href=\"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/11\/publication-de-kotlin-1-6-0\/#how-to-install\">Mise \u00e0 jour vers Kotlin 1.6.0<\/a><\/p>\n<h1 id=\"language-features\">Fonctionnalit\u00e9s du langage<\/h1>\n<p>Nous avons stabilis\u00e9 les fonctionnalit\u00e9s de Kotlin 1.5.30 en tenant compte de vos retours d&#8217;exp\u00e9rience.<\/p>\n<h2>D\u00e9clarations <code>when<\/code> (exhaustives) scell\u00e9es<\/h2>\n<p>Les d\u00e9clarations <code>when<\/code> scell\u00e9es sont une fonctionnalit\u00e9 <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-12380\" target=\"_blank\" rel=\"noopener\">tr\u00e8s attendue<\/a> qui permet au compilateur de Kotlin de vous avertir si vos instructions when ne sont pas exhaustives. Cela am\u00e9liore la s\u00e9curit\u00e9 de votre code sans avoir \u00e0 introduire vos propres fonctions.\u00a0<\/p>\n<p>Kotlin a toujours \u00e9t\u00e9 exhaustif dans la v\u00e9rification des <em>expressions <\/em><code>when<\/code> pour les enums, les types bool\u00e9ens et les classes scell\u00e9s. Cela s&#8217;av\u00e8re utile lorsque vous mod\u00e9lisez votre domaine avec les types de donn\u00e9es alg\u00e9briques. Vous pouvez par exemple mod\u00e9liser diverses pr\u00e9f\u00e9rences de contact pour les utilisateurs de votre application sous la forme d&#8217;une hi\u00e9rarchie de classe scell\u00e9e\u00a0:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">sealed 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<p>D\u00e9sormais, lorsque vous \u00e9crivez une expression qui renvoie un r\u00e9sultat diff\u00e9rent en fonction des pr\u00e9f\u00e9rences de contact, le compilateur signalera une erreur si vous oubliez de g\u00e9rer tous les types pr\u00e9sents dans votre application :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun 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<p>C&#8217;est une aide pr\u00e9cieuse, tant pour l&#8217;\u00e9criture du code que pour sa maintenance. Si vous ajoutez ult\u00e9rieurement un autre type de pr\u00e9f\u00e9rence de contact, vous savez que le compilateur s&#8217;assurera que vous n&#8217;ayez pas oubli\u00e9 de v\u00e9rifier et g\u00e9rer les diff\u00e9rents types de pr\u00e9f\u00e9rences de contact dans votre code.<\/p>\n<p>A noter qu&#8217;avant Kotlin 1.6, le code qui utilisait <em>instructions<\/em> <code>when<\/code> \u00e9tait correctement compil\u00e9, m\u00eame s&#8217;il ne g\u00e9rait pas l&#8217;envoi de notifications aux utilisateurs via messages instantan\u00e9s :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun 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<p>Seule une inspection faible de l&#8217;IDE \u00e9tait signal\u00e9e, sans aucun message du compilateur. \u00c0 partir de Kotlin 1.6, l&#8217;avertissement du compilateur est le suivant :<\/p>\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<p>Dand Kotlin 1.7, cela deviendra une erreur, ce qui supprimera tout risque d&#8217;oubli. Veuillez consulter le <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-47709\" target=\"_blank\" rel=\"noopener\">document KT-47709<\/a> pour plus de d\u00e9tails sur ce changement et ses effets.\u00a0<\/p>\n<h2>Fonctions suspensives en tant que supertypes<\/h2>\n<p>Kotlin 1.6 stabilise la prise en charge de l&#8217;impl\u00e9mentation de types fonctionnels <code>suspend<\/code> en tant que super interfaces. C&#8217;\u00e9tait l&#8217;une des pi\u00e8ces manquantes dans les coroutines de Kotlin.\u00a0<\/p>\n<p>Lorsque vous concevez des API Kotlin, les types fonctionnels sont g\u00e9n\u00e9ralement utilis\u00e9s lorsque vous devez personnaliser le comportement de plusieurs fonctions de la biblioth\u00e8que. Par exemple, l&#8217;API <code>kotlinx.coroutines<\/code> a une fonction membre dans son interface Job qui ressemble \u00e0 ceci :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun invokeOnCompletion(handler: () -&gt; Unit)\n<\/pre>\n<p>Vous pouvez facilement utiliser cette fonction avec des lambdas comme <code><em>invokeOnCompletion <\/em><strong>{ <\/strong><em>doSomething<\/em>() <strong>}<\/strong><\/code>. Si vous avez une classe avec laquelle vous voulez g\u00e9rer la compl\u00e9tion, vous pouvez simplifier et optimiser votre code en impl\u00e9mentant le type fonctionnel <code>() -&gt; Unit<\/code> directement dans votre classe sans cr\u00e9er de lambda suppl\u00e9mentaire :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">class MyCompletionHandler : () -&gt; Unit {\n   override fun invoke() { doSomething() }\n}\n<\/pre>\n<p>\u00c0 partir de Kotlin 1.6, cette optimisation est possible avec les fonctions suspensives. Si vos API acceptent les types fonctionnels suspensifs, comme par exemple :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">public fun launchOnClick(action: suspend () -&gt; Unit) {}\n<\/pre>\n<p>\u2026 alors vous n&#8217;avez plus de restrictions sur l&#8217;utilisation des lambdas et des fonctions d&#8217;arr\u00eat dans votre code. Vous pouvez aussi impl\u00e9menter les types fonctionnels suspensifs correspondants dans une classe :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">class MyClickAction : suspend () -&gt; Unit {\n   override suspend fun invoke() { doSomething() }\n}\n<\/pre>\n<h2>Conversions suspensives<\/h2>\n<p>Kotlin 1.6 stabilise les conversions des types de fonctions standard en fonctions suspensives. Vous pouvez maintenant utiliser les types de fonctions standard appropri\u00e9s lorsqu&#8217;un param\u00e8tre de type suspensif est attendu. Le compilateur effectuera automatiquement la conversion.<\/p>\n<p>Cela corrige une petite (mais p\u00e9nible) incoh\u00e9rence dans l&#8217;interaction entre les fonctions standard et les fonctions suspensives en Kotlin. Si vous avez une fonction d&#8217;ordre sup\u00e9rieur qui accepte une fonction suspensive, comme un appel <a href=\"https:\/\/kotlin.github.io\/kotlinx.coroutines\/kotlinx-coroutines-core\/kotlinx.coroutines.flow\/collect.html\" target=\"_blank\" rel=\"noopener\">collect<\/a> sur un flux Kotlin, au lieu d&#8217;utiliser une lambda pour l&#8217;appeler, comme ceci :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">flow.collect { processItem(it) }\n<\/pre>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun processItem(item: Item) { \/* ... *\/ }\n<\/pre>\n<p>\u2026 vous pouvez passer une r\u00e9f\u00e9rence \u00e0 la fonction <code>processItem<\/code> dans l&#8217;appel <code>collect<\/code> pour obtenir le m\u00eame r\u00e9sultat :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">flow.collect(::processItem)\n<\/pre>\n<p>Dans ce cas, vous devriez ensuite extraire une r\u00e9f\u00e9rence \u00e0 votre fonction de traitement dans une variable afin de personnaliser son comportement dans votre code. Cette technique ne fonctionnait pas dans les versions ant\u00e9rieures \u00e0 Kotlin 1.6 car il s&#8217;agit d&#8217;une fonction standard qui est pass\u00e9e en tant que param\u00e8tre d&#8217;un type suspensif :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">val processingFunction = ::processItem\nflow.collect(processingFunction) \/\/ ERROR: Type mismatch\n<\/pre>\n<p>Avec Kotlin 1.6, le code ci-dessus se compile et fonctionne.<\/p>\n<h2>Inf\u00e9rence de type am\u00e9lior\u00e9e pour les types g\u00e9n\u00e9riques r\u00e9cursifs<\/h2>\n<p>Avec la version 1.6.0, le compilateur Kotlin peut d\u00e9duire un argument de type en se basant uniquement sur les limites sup\u00e9rieures du param\u00e8tre de type correspondant s&#8217;il s&#8217;agit d&#8217;un g\u00e9n\u00e9rique r\u00e9cursif par d\u00e9faut. Cela permet de cr\u00e9er divers mod\u00e8les avec des types g\u00e9n\u00e9riques r\u00e9cursifs qui sont souvent utilis\u00e9s en Java pour r\u00e9aliser des API de constructeur.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\/\/ Avant 1.5.30\nval containerA = PostgreSQLContainer&lt;nothing&gt;(DockerImageName.parse(\"postgres:13-alpine\")).apply {\n    withDatabaseName(\"db\")\n    withUsername(\"user\")\n    withPassword(\"password\")\n    withInitScript(\"sql\/schema.sql\")\n}\n\n\/\/ Avec l'option du compilateur dans la version 1.5.30 ou par d\u00e9faut \u00e0 partir de la version 1.6.0\nval containerB = PostgreSQLContainer(DockerImageName.parse(\"postgres:13-alpine\"))\n    .withDatabaseName(\"db\")\n    .withUsername(\"user\")\n    .withPassword(\"password\")\n    .withInitScript(\"sql\/schema.sql\")\n<\/pre>\n<p>\u00a0<\/p>\n<h2>Am\u00e9lioration de l&#8217;inf\u00e9rence de constructeur<\/h2>\n<p>La version 1.5.30 de Kotlin a inaugur\u00e9 l&#8217;option de compilation <code>-Xunrestricted-builder-inference<\/code>, qui permet d&#8217;obtenir des informations sur le type d&#8217;un appel au constructeur \u00e0 l&#8217;int\u00e9rieur des lambdas du constructeur. Cela permet notamment d&#8217;effectuer des appels qui renvoient une instance d&#8217;un type pas encore d\u00e9duit, comme <code>get()<\/code> dans une lambda <code>buildList()<\/code>.<\/p>\n<p>\u00c0 partir de la version 1.6.0, vous n&#8217;avez plus besoin de sp\u00e9cifier <code>-Xunrestricted-builder-inference<\/code> pour effectuer des appels pr\u00e9c\u00e9demment interdits. Avec l&#8217;option de compilation <code>-Xenable-builder-inference<\/code>, vous pouvez d\u00e9sormais \u00e9crire vos propres constructeurs g\u00e9n\u00e9riques sans appliquer l&#8217;annotation <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/-builder-inference\/\" target=\"_blank\" rel=\"noopener\"><code>@BuilderInference<\/code><\/a> et activer automatiquement l&#8217;inf\u00e9rence de constructeur si l&#8217;inf\u00e9rence de type ordinaire ne peut pas r\u00e9soudre les informations de type.<\/p>\n<h2>Prolongement de la prise en charge des versions d&#8217;API<\/h2>\n<p>Avec Kotlin 1.6.0, vous pouvez d\u00e9velopper en utilisant trois versions pr\u00e9c\u00e9dentes de l&#8217;API (en plus de la version stable actuelle) au lieu de deux. Actuellement, cela inclut donc les versions 1.3, 1.4, 1.5 et 1.6 de l&#8217;API.<\/p>\n<h1 id=\"jvm\">Kotlin\/JVM<\/h1>\n<p><strong>Annotations reproductibles avec r\u00e9tention RUNTIME<\/strong> Kotlin, comme <a href=\"https:\/\/docs.oracle.com\/javase\/tutorial\/java\/annotations\/repeating.html\" target=\"_blank\" rel=\"noopener\">Java 8<\/a>, dispose d&#8217;annotations reproductibles. Avec Kotlin 1.6, la fonctionnalit\u00e9 est compatible avec Java et <code>@kotlin.annotation.Repeatable<\/code> accepte d\u00e9sormais toute r\u00e9tention et rend l&#8217;annotation reproductible en Kotlin et en Java. Les annotations r\u00e9p\u00e9tables Java sont d\u00e9sormais \u00e9galement prises en charge c\u00f4t\u00e9 Kotlin.<\/p>\n<h1 id=\"native\">Kotlin\/Native<\/h1>\n<p>Vous pouvez maintenant essayer la version exp\u00e9rimentale du <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/try-the-new-kotlin-native-memory-manager-development-preview\/\"><strong>nouveau gestionnaire de m\u00e9moire Kotlin\/Native<\/strong><\/a>. Gr\u00e2ce \u00e0 cette fonctionnalit\u00e9, nous pouvons offrir une exp\u00e9rience de d\u00e9veloppement plus coh\u00e9rente pour les projets multiplateforme. Le nouveau gestionnaire de m\u00e9moire l\u00e8ve les restrictions sur le partage d&#8217;objets entre les threads et fournit des primitives de programmation concurrentes totalement exemptes de fuites, s\u00fbres et ne n\u00e9cessitant aucune gestion ou annotation sp\u00e9ciales de la part des d\u00e9veloppeurs.<\/p>\n<p>Vous pouvez librement mettre \u00e0 jour votre Xcode et continuer \u00e0 travailler sur vos projets Kotlin car Kotlin\/Native <strong>prend<\/strong> d\u00e9sormais <strong>en charge Xcode 13<\/strong>.\u00a0<\/p>\n<p><strong>Compilation de cibles Windows sur n&#8217;importe quel h\u00f4te.<\/strong> Vous pouvez compiler les cibles Windows <code>mingwX64<\/code> et <code>mingwX86<\/code> sur tout h\u00f4te prenant en charge Kotlin\/Native.<\/p>\n<p>Nous avons <strong>remani\u00e9 la d\u00e9pendance LLVM<\/strong> que Kotlin\/Native utilise en interne. Cela apporte plusieurs avantages, comme la mise \u00e0 jour de la version 11.1.0 de LLVM et la diminution de la taille des d\u00e9pendances.<\/p>\n<p><strong>ABI du plugin du compilateur unifi\u00e9e avec les backends JVM et JS IR<\/strong>. Le plugin Kotlin Multiplatform Gradle est d\u00e9sormais en mesure d&#8217;utiliser le compilateur jar int\u00e9grable (celui utilis\u00e9 pour les backends JVM et JS IR) pour Kotlin\/Native. Vous pouvez utiliser les m\u00eames artefacts de plugin de compilation pour Native et les autres plateformes prises en charge.<\/p>\n<h1 id=\"js\">Kotlin\/JS<\/h1>\n<p>Pour cr\u00e9er sur un serveur sans connexion Internet, vous pouvez d\u00e9sormais d\u00e9sactiver le t\u00e9l\u00e9chargement de Node.js et de Yarn pour les projets Kotlin\/JS et utiliser les instances d\u00e9j\u00e0 install\u00e9es sur l&#8217;h\u00f4te.<\/p>\n<h1 id=\"kover\">Kover<\/h1>\n<p>Depuis la premi\u00e8re version, la mesure pr\u00e9cise de la couverture du code a \u00e9t\u00e9 un d\u00e9fi. D&#8217;excellents outils comme JaCoCo fonctionnent avec du code Kotlin mais ne sont pas totalement int\u00e9gr\u00e9s \u00e0 notre cha\u00eene d&#8217;outils Gradle et aux projets multiplateforme. Dans cette version de Kotlin, nous avons commenc\u00e9 \u00e0 corriger ce probl\u00e8me. D\u00e9couvrez Kover, notre nouveau plugin Gradle qui mesure la couverture du code Kotlin g\u00e9n\u00e9r\u00e9 avec le compilateur Kotlin\/JVM. Nous ne sommes qu&#8217;au d\u00e9but de sa phase de d\u00e9veloppement et il reste exp\u00e9rimental. N&#8217;h\u00e9sitez pas \u00e0 nous faire part de vos retours le concernant sur <a class=\"ek-link\" href=\"https:\/\/github.com\/Kotlin\/kotlinx-kover\/issues\" target=\"_blank\" rel=\"noopener\">GitHub<\/a>.<\/p>\n<p><a href=\"https:\/\/youtu.be\/jNu5LY9HIbw\" target=\"_blank\" rel=\"noopener\">Regardez la vid\u00e9o sur Kover pour en savoir plus<\/a>.<\/p>\n<h1 id=\"standard-library\">Biblioth\u00e8que standard<\/h1>\n<p>Kotlin 1.6.0 coche trois \u00e9l\u00e9ments de la feuille de route stdlib en <a class=\"ek-link\" href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46785\" target=\"_blank\" rel=\"noopener\">supprimant <code>!!<\/code> apr\u00e8s <code>readLine()<\/code><\/a>, en <a class=\"ek-link\" href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-45396\" target=\"_blank\" rel=\"noopener\">stabilisant <code>typeOf()<\/code><\/a> et en <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46784\" target=\"_blank\" rel=\"noopener\">fournissant une API Duration stable<\/a>. Il am\u00e8ne \u00e9galement les fonctions stdlib suivantes \u00e0 l&#8217;\u00e9tat <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">stable<\/a>\u00a0:<\/p>\n<ul>\n<li>Constructeurs de collections<\/li>\n<li>Op\u00e9rations de rotation par bits sur des entiers<\/li>\n<li>Fonction Regex pour diviser une cha\u00eene de caract\u00e8res en s\u00e9quence<\/li>\n<\/ul>\n<p>Nous avons \u00e9galement ajout\u00e9 la possibilit\u00e9 d&#8217;appeler <code>compareTo<\/code> en notation infixe et offrons une exp\u00e9rience coh\u00e9rente pour les fonctions <code>replace()<\/code> dans JVM et JS.<\/p>\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\">\n<div class=\"wp-block-embed__wrapper\"><iframe loading=\"lazy\" title=\"Changements dans la biblioth\u00e8que standard de Kotlin en 1.6\" src=\"https:\/\/www.youtube.com\/embed\/GWWFCyfNGFs?feature=oembed\" width=\"500\" height=\"281\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\n<\/figure>\n<h2>Nouvelles fonctions pour l&#8217;entr\u00e9e standard<\/h2>\n<p>Avec Kotlin 1.6.0, nous avons supprim\u00e9 la n\u00e9cessit\u00e9 d&#8217;utiliser l&#8217;op\u00e9rateur d&#8217;assertion not-null <code>!!<\/code> apr\u00e8s avoir lu une ligne de l&#8217;entr\u00e9e standard, afin d&#8217;am\u00e9liorer l&#8217;exp\u00e9rience des novices et de simplifier l&#8217;enseignement de Kotlin.<\/p>\n<p>Nous fournissons de nouvelles fonctions pour la lecture \u00e0 partir de la console avec l&#8217;exp\u00e9rience suivante :<\/p>\n<ul>\n<li><code>readln()<\/code> l\u00e8ve une exception lorsque la fin du fichier (EOF) a \u00e9t\u00e9 atteinte. Utilisez cette fonction au lieu de v\u00e9rifier si le r\u00e9sultat de <code>readLine()<\/code> est <code>null<\/code> avec l&#8217;op\u00e9rateur <code>!!<\/code>.<\/li>\n<li>La nouvelle fonction <code>readlnOrNull()<\/code> est une alternative \u00e0 un retour <code>null<\/code>. Elle se comporte de la m\u00eame mani\u00e8re que l&#8217;ancienne <code>readLine()<\/code>, mais porte un nom plus repr\u00e9sentatif.<\/li>\n<\/ul>\n<p>Ces fonctions sont maintenant disponibles pour JVM et Native. La convention de nommage de ces fonctions est d\u00e9sormais coh\u00e9rente avec leur contrepartie <code>println()<\/code>, un point particuli\u00e8rement important pour les novices.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun main() {\n    println(\"Input two integer numbers each on a separate line\")\n    val num1 = readln().toInt()\n    val num2 = readln().toInt()\n    println(\"The sum of $num1 and $num2 is ${num1 + num2}\")\n}\n<\/pre>\n<h2>API Duration stable<\/h2>\n<p>Gr\u00e2ce \u00e0 vos retours, nous avons stabilis\u00e9 l&#8217;API Duration et ferm\u00e9 l&#8217;<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-46784\" target=\"_blank\" rel=\"noopener\">\u00e9l\u00e9ment correspondant sur la feuille de route<\/a>.<\/p>\n<p>En plus d&#8217;une meilleure lisibilit\u00e9 du r\u00e9sultat de <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/to-string.html\" target=\"_blank\" rel=\"noopener\"><code>Duration.toString()<\/code><\/a> et des <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1530.html#standard-library\" target=\"_blank\" rel=\"noopener\">nouvelles fonctions d&#8217;analyse de dur\u00e9es \u00e0 partir d&#8217;une cha\u00eene de caract\u00e8res<\/a>, qui \u00e9taient disponibles en preview dans la version 1.5.30, l&#8217;API Duration a fait l&#8217;objet des modifications suivantes :<\/p>\n<ul>\n<li>Le composant <code>days<\/code> de la fonction <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/to-components.html\" target=\"_blank\" rel=\"noopener\"><code>toComponents<\/code><\/a> a maintenant le type <code>Long<\/code> au lieu de <code>Int<\/code> pour \u00e9viter que les valeurs ne soient tronqu\u00e9es.<\/li>\n<li>L&#8217;enum <em><code>DurationUnit<\/code> <\/em>n&#8217;est plus un alias de type. La JVM n&#8217;a pas de cas d&#8217;utilisation en tant qu&#8217;alias pour <em> j <code> ava.util.concurrent.TimeUnit <\/code> <\/em>.<\/li>\n<li>En r\u00e9action aux retours de la communaut\u00e9, nous r\u00e9activons des propri\u00e9t\u00e9s d&#8217;extension comme <code>Int.seconds<\/code>. Pour limiter leur applicabilit\u00e9, elles ne sont disponibles que dans le compagnon de la classe Duration.<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\">import kotlin.time.Duration.Companion.seconds\n\nfun main() {\n\/\/sampleStart\n    val duration = 5000.seconds\n    println(\"There are ${duration.inWholeMinutes} minutes in ${duration.inWholeHours} hours\")\n\/\/sampleEnd\n}\n<\/pre>\n<h2>Fonction <code>typeOf()<\/code> stable<\/h2>\n<p>Kotlin 1.6.0 apporte <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">Une fonction <\/a><a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/type-of.html\" target=\"_blank\" rel=\"noopener\"><code>typeOf()<\/code> stable<\/a> et ferme l&#8217;<a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-45396\" target=\"_blank\" rel=\"noopener\">\u00e9l\u00e9ment correspondant de la feuille de route<\/a>. <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/06\/kotlin-1-3-40-released\/\">Depuis la version 1.3.40<\/a>, <code>typeOf()<\/code> est disponible sur la plateforme JVM en tant qu&#8217;API exp\u00e9rimentale. Vous pouvez maintenant l&#8217;utiliser sur n&#8217;importe quelle plateforme Kotlin pour obtenir une repr\u00e9sentation <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/-k-type\/#kotlin.reflect.KType\" target=\"_blank\" rel=\"noopener\"><code>KType<\/code><\/a> de n&#8217;importe quel type Kotlin que le compilateur peut d\u00e9duire.\u00a0<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">inline 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<h2>Constructeurs de collections stables<\/h2>\n<p>Kotlin 1.6.0 passe les fonctions de construction de collection (<a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-map.html\" target=\"_blank\" rel=\"noopener\"><code>buildMap()<\/code><\/a>, <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-list.html\" target=\"_blank\" rel=\"noopener\"><code>buildList()<\/code><\/a> et <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.collections\/build-set.html\" target=\"_blank\" rel=\"noopener\"><code>buildSet()<\/code><\/a>) au stade <a href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">stable<\/a>. Les collections retourn\u00e9es par les constructeurs sont maintenant s\u00e9rialisables en lecture seule.<\/p>\n<h2>Op\u00e9rations de rotation par bits stables pour les entiers<\/h2>\n<p>Avec Kotlin 1.6.0, les fonctions <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/rotate-left.html\" target=\"_blank\" rel=\"noopener\"><code>rotateLeft()<\/code><\/a> et <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin\/rotate-right.html\" target=\"_blank\" rel=\"noopener\"><code>rotateRight()<\/code><\/a>, qui font pivoter la repr\u00e9sentation binaire du nombre vers la gauche ou la droite d&#8217;un nombre de bits sp\u00e9cifi\u00e9, sont devenues <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/components-stability.html\" target=\"_blank\" rel=\"noopener\">stables<\/a>.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\">fun 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<h2>Fonction Regex stable pour diviser une cha\u00eene de caract\u00e8res en s\u00e9quence<\/h2>\n<p>Kotlin 1.6.0 stabilise \u00e9galement <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/split-to-sequence.html\" target=\"_blank\" rel=\"noopener\"><code>splitToSequence()<\/code><\/a>, une fonction pour les expressions r\u00e9guli\u00e8res qui divise une cha\u00eene de caract\u00e8res en s\u00e9quence.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\">fun main(){\n\/\/sampleStart\n    val colorsText = \"green, red , brown&amp;blue, orange, pink&amp;green\"\n    val regex = \"[,\\\\s]+\".toRegex()\n    val mixedColor = regex.splitToSequence(colorsText)\n        .onEach { println(it) }\n        .firstOrNull { it.contains('&amp;') }\n    println(mixedColor) \/\/ \"brown&amp;blue\"\n\/\/sampleEnd\n}\n<\/pre>\n<h2>compareTo en notation infixe<\/h2>\n<p>Nous avons ajout\u00e9 la possibilit\u00e9 d&#8217;appeler la fonction <code>Comparable.compareTo<\/code> en notation infixe pour comparer l&#8217;ordre de deux objets :\u00a0<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">class 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<h2>Coh\u00e9rence de replace() et replaceFirst() sur JVM et JS<\/h2>\n<p>Avant Kotlin 1.6.0, les fonctions <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/replace.html\" target=\"_blank\" rel=\"noopener\"><code>replace()<\/code><\/a> et <a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/-regex\/replace-first.html\" target=\"_blank\" rel=\"noopener\"><code>replaceFirst()<\/code><\/a> se comportaient diff\u00e9remment sur JVM et JS lorsque la cha\u00eene de remplacement contenait une r\u00e9f\u00e9rence \u00e0 un groupe. Le comportement sur Kotlin\/JS est maintenant le m\u00eame que sur JVM.<\/p>\n<h1 id=\"compatibility\">\u200b\u200bCompatibilit\u00e9<\/h1>\n<p>Comme lors de chaque mise \u00e0 jour de fonctionnalit\u00e9s, certains cycles d&#8217;obsolescence de changements annonc\u00e9s pr\u00e9c\u00e9demment arrivent \u00e0 leur terme avec Kotlin 1.6.0. Tous ces cas ont \u00e9t\u00e9 soigneusement examin\u00e9s par le comit\u00e9 du langage et sont r\u00e9pertori\u00e9s dans le<a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\"> Guide de compatibilit\u00e9 pour Kotlin 1.6<\/a>. Vous pouvez \u00e9galement consulter ces changements sur YouTrack.<\/p>\n<h1 id=\"how-to-install\">Comment installer Kotlin 1.6.0<\/h1>\n<p>Si vous utilisez <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/#section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> ou <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>, votre IDE vous proposera de mettre \u00e0 jour Kotlin vers la version 1.6.0 automatiquement. Vous pouvez \u00e9galement lancer une mise \u00e0 jour manuellement en suivant <a href=\"https:\/\/kotlinlang.org\/docs\/releases.html#update-to-a-new-release\" target=\"_blank\" rel=\"noopener\">ces instructions<\/a>.<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger les derni\u00e8res versions des IDE suivants pour b\u00e9n\u00e9ficier d&#8217;une prise en charge \u00e9tendue pour Kotlin :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/idea\/download\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a> \u2013 pour d\u00e9velopper des applications Kotlin pour diff\u00e9rentes plateformes.<\/li>\n<li><a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a> \u2013 pour d\u00e9velopper des applications mobiles Android et multiplateforme.<\/li>\n<\/ul>\n<p>Assurez-vous \u00e9galement de mettre \u00e0 jour les biblioth\u00e8ques kotlinx vers des <a href=\"https:\/\/kotlinlang.org\/releases.html#release-details\" target=\"_blank\" rel=\"noopener\">versions compatibles<\/a> et de sp\u00e9cifier la version Kotlin 1.6.0 dans les scripts de build de vos projets existants.<\/p>\n<p>Si vous avez besoin du compilateur en ligne de commande, t\u00e9l\u00e9chargez-le depuis la <a class=\"ek-link\" href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.6.0\" target=\"_blank\" rel=\"noopener\">page Github de la version<\/a>.<\/p>\n<h3>En cas de probl\u00e8me<\/h3>\n<ul>\n<li>Trouvez de l&#8217;aide sur <a href=\"http:\/\/kotlinlang.slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a> (<a href=\"https:\/\/surveys.jetbrains.com\/s3\/kotlin-slack-sign-up\" target=\"_blank\" rel=\"noopener\">recevoir une invitation<\/a>).<\/li>\n<li>Signalez-le dans notre outil de suivi de tickets, <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/li>\n<\/ul>\n<div style=\"background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; text-align: left; min-height: px;\">\n<p>Restez au courant des derni\u00e8res fonctionnalit\u00e9s de Kotlin ! Inscrivez-vous en remplissant le formulaire \u00e0 droite de cet article pour recevoir les actualit\u00e9s relatives \u00e0 Kotlin.<\/p>\n<\/div>\n<h1>Autres lectures et vid\u00e9os<\/h1>\n<ul>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/roadmap.html\" target=\"_blank\" rel=\"noopener\">Feuille de route de Kotlin<\/a><\/li>\n<li><a class=\"ek-link\" href=\"https:\/\/youtu.be\/jNu5LY9HIbw\" target=\"_blank\" rel=\"noopener\">Kover &#8211; Le plugin de couverture de code<\/a><\/li>\n<li><a class=\"ek-link\" href=\"https:\/\/kotlinlang.org\/docs\/whatsnew16.html\" target=\"_blank\" rel=\"noopener\">Nouveaut\u00e9s de Kotlin 1.6.0 dans la documentation<\/a><\/li>\n<li><a class=\"ek-link\" href=\"https:\/\/youtu.be\/6jrmcfYdfvI\" target=\"_blank\" rel=\"noopener\">Nouveaut\u00e9s de Kotlin 1.6.0 sur YouTube<\/a><\/li>\n<li><a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-16.html\" target=\"_blank\" rel=\"noopener\">Guide de compatibilit\u00e9 pour Kotlin 1.6<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/08\/kotlin-1-5-30-released\/\">Kotlin 1.5.30 est disponible !<\/a><\/li>\n<\/ul>\n<h1>Principaux auteurs de tickets sur YouTrack<\/h1>\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<h1>Contributeurs externes<\/h1>\n<p>Un grand merci \u00e0 l&#8217;ensemble de nos contributeurs et contributrices dont les requ\u00eates pull ont \u00e9t\u00e9 incluses dans cette version\u00a0: <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\/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 class=\"ek-link\" href=\"mailto:stumpos@fb.com\">Steffi Stumpos<\/a>, <a class=\"ek-link\" href=\"https:\/\/github.com\/akuleshov7\" target=\"_blank\" rel=\"noopener\">Andrey Kuleshov<\/a>.<\/p>\n<p><em>Auteur de l&#8217;article original en anglais :<\/em><\/p>\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":813,"featured_media":202895,"comment_status":"closed","ping_status":"closed","template":"","categories":[907],"tags":[671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/215756"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=215756"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/215756\/revisions"}],"predecessor-version":[{"id":215779,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/215756\/revisions\/215779"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/202895"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=215756"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=215756"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=215756"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=215756"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}