{"id":139951,"date":"2021-04-26T16:56:00","date_gmt":"2021-04-26T15:56:00","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/"},"modified":"2021-05-05T16:29:55","modified_gmt":"2021-05-05T15:29:55","slug":"kotlin-1-5-0-rc-released-fr","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released-fr\/","title":{"rendered":"Publication de la version 1.5.0-RC de Kotlin\u00a0: modifications dans les biblioth\u00e8ques standard et de tests"},"content":{"rendered":"<p>La version Release Candidate de Kotlin 1.5.0 est disponible et comprend toutes les fonctionnalit\u00e9s pr\u00e9vues pour la version 1.5.0. finale ! De nouvelles fonctionnalit\u00e9s de langage, des mises \u00e0 jour de stdlib, une biblioth\u00e8que de tests am\u00e9lior\u00e9e et bien d&#8217;autres changements. Les seuls modifications suppl\u00e9mentaires pour la version 1.5.0 finale \u00e0 venir seront des correctifs.<\/p>\n<p>Essayez les API de Kotlin dans vos projets avec la version 1.5.0-RC et contribuez \u00e0 peaufiner la version finale&nbsp;! Vous pouvez nous signaler tout probl\u00e8me via notre outil de suivi <a href=\"https:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Installer\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Installer la version 1.5.0-RC<\/a><\/p>\n<p>Dans cet article, nous vous pr\u00e9sentons les modifications apport\u00e9es aux biblioth\u00e8ques standard et de tests de Kotlin dans la version 1.5.0-RC&nbsp;:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#stable-unsigned-integer-types\">Types d&#8217;entiers non sign\u00e9s stables<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#extensions-for-java-nio-path\">Extensions pour java.nio.file.Path<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#locale-agnostic-upper-lowercase\">Am\u00e9liorations des API String et Char<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#duration-api-changes\">Modifications dans l&#8217;API Duration<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#math-operations-floordiv-mod\">Nouvelles op\u00e9rations math\u00e9matiques pour l&#8217;arithm\u00e9tique modulaire<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#collections-firstnotnullof\">Nouvelles fonctions de collection<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#test-library-changes\">Modifications dans la biblioth\u00e8que de tests<\/a><\/li>\n<\/ul>\n<p>Lisez ce qui suit pour conna\u00eetre tous les d\u00e9tails&nbsp;!<\/p>\n<p><a name=\"stable-unsigned-integer-types\"><\/a><\/p>\n<h2>Types d&#8217;entiers non sign\u00e9s stables<\/h2>\n<p>La biblioth\u00e8que standard comprend l&#8217;API des entiers non sign\u00e9s, utile pour traiter les op\u00e9rations sur les entiers non n\u00e9gatifs. Elle comprend :<\/p>\n<ul>\n<li>Types de nombres non sign\u00e9s&nbsp;: <code>UInt<\/code>, <code>ULong<\/code>, <code>UByte<\/code>, <code>UShort<\/code> et fonctions associ\u00e9es telles que les conversions.<\/li>\n<li>Types d&#8217;agr\u00e9gats : tableaux, plages et progressions d&#8217;entiers non sign\u00e9s&nbsp;: <code>UIntArray<\/code>, <code>UIntRange<\/code> et conteneurs similaires pour d&#8217;autres types.<\/li>\n<\/ul>\n<p>Les types d&#8217;entiers non sign\u00e9s sont disponibles en b\u00eata depuis la version <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew13.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">Kotlin 1.3<\/a>. Nous classons maintenant les types et les op\u00e9rations des entiers non sign\u00e9s comme stables, les rendant disponibles sans opt-in et utilisables en toute s\u00e9curit\u00e9 dans des projets r\u00e9els.<\/p>\n<p>Les nouvelles API stables sont&nbsp;:<\/p>\n<ul>\n<li>Types d&#8217;entiers non sign\u00e9s<\/li>\n<li>Plages et progressions des types d&#8217;entiers non sign\u00e9s<\/li>\n<li>Fonctions qui op\u00e8rent avec des types d&#8217;entiers non sign\u00e9s<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    val zero = 0U \/\/ Define unsigned numbers with literal suffixes\n    val ten = 10.toUInt() \/\/ or by converting non-negative signed numbers\n    \/\/val minusOne: UInt = -1U \/\/ Error: unary minus is not defined\n    val range: UIntRange = zero..ten \/\/ Separate types for ranges and progressions\n\n    for (i in range) print(i)\n    println()\n    println(\"UInt covers the range from ${UInt.MIN_VALUE} to ${UInt.MAX_VALUE}\") \/\/ UInt covers the range from 0 to 4294967295\n\/\/sampleEnd\n}\n<\/pre>\n<p>Les tableaux d&#8217;entiers non sign\u00e9s restent en b\u00eata. Il en va de m\u00eame pour les entiers non sign\u00e9s <a href=\"https:\/\/kotlinlang.org\/docs\/functions.html#variable-number-of-arguments-varargs\" target=\"_blank\" rel=\"noopener\">varargs<\/a> qui sont support\u00e9s par des tableaux. Si vous souhaitez les utiliser dans votre code, vous pouvez le faire avec l&#8217;annotation <code>@ExperimentalUnsignedTypes<\/code>.<\/p>\n<p>En savoir plus sur <a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">les entiers non sign\u00e9s dans Kotlin<\/a>.<\/p>\n<p><a name=\"extensions-for-java-nio-path\"><\/a><\/p>\n<h2>Extensions pour l&#8217;API java.nio.file.Path<\/h2>\n<p>Kotlin fournit maintenant un moyen d&#8217;utiliser <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/nio\/package-summary.html\" target=\"_blank\" rel=\"noopener\">l&#8217;entr\u00e9e\/sortie Java non bloquante<\/a> moderne dans un style idiomatique Kotlin pr\u00eat \u00e0 l&#8217;emploi via les fonctions d&#8217;extension pour <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/nio\/file\/Path.html\" target=\"_blank\" rel=\"noopener\"><code>java.nio.file.Path<\/code><\/a>.<\/p>\n<p>Voici un petit exemple&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">import kotlin.io.path.*\nimport java.nio.file.Path\n\nfun main() {\n    \/\/ construct path with the div (\/) operator\n    val baseDir = Path(\"\/base\")\n    val subDir = baseDir \/ \"subdirectory\"\n\n    \/\/ list files in a directory\n    val kotlinFiles = Path(\"\/home\/user\").listDirectoryEntries(\"*.kt\")\n    \/\/ count lines in all kotlin files\n    val totalLines = kotlinFiles.sumOf { file -&gt; file.useLines { lines -&gt; lines.count() } }\n}\n<\/pre>\n<p>Ces extensions ont \u00e9t\u00e9 introduites en tant que fonctionnalit\u00e9 exp\u00e9rimentale <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1420.html#extensions-for-java-nio-file-path\" target=\"_blank\" rel=\"noopener\">dans Kotlin 1.4.20<\/a> et sont maintenant disponibles sans opt-in. Consultez le paquet <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.io.path\/\" target=\"_blank\" rel=\"noopener\"><code>kotlin.io.path<\/code><\/a> pour la liste des fonctions que vous pouvez utiliser.<\/p>\n<p>Les extensions existantes pour File API restent disponibles, vous \u00eates donc libre de choisir l&#8217;API que vous pr\u00e9f\u00e9rez.<\/p>\n<p><a name=\"locale-agnostic-upper-lowercase\"><\/a><\/p>\n<h2>API ind\u00e9pendante des param\u00e8tres de localisation pour les majuscules et les minuscules<\/h2>\n<p>Beaucoup d&#8217;entre vous sont familiers avec les fonctions stdlib permettant de changer la casse des cha\u00eenes et des caract\u00e8res&nbsp;: <code>toUpperCase()<\/code>, <code>toLowerCase()<\/code>, <code>toTitleCase()<\/code>. Elles fonctionnent g\u00e9n\u00e9ralement bien, mais peuvent devenir un v\u00e9ritable casse-t\u00eate lorsqu&#8217;il s&#8217;agit de g\u00e9rer diff\u00e9rentes localisations de plateformes. Elles sont toutes sensibles aux param\u00e8tres de localisation, leur r\u00e9sultat peut donc varier en fonction de la localisation. Par exemple, que retourne <code>\"Kotlin\".toUpperCase()<\/code>&nbsp;? \u00ab&nbsp;Bien \u00e9videmment <code>KOTLIN<\/code>&nbsp;\u00bb, diriez-vous. Mais dans les param\u00e8tres r\u00e9gionaux turcs, le <code>i<\/code> majuscule est <code>\u0130<\/code>, donc le r\u00e9sultat est diff\u00e9rent&nbsp;: <code>KOTL\u0130N<\/code>.<\/p>\n<p>Il existe d\u00e9sormais une nouvelle API ind\u00e9pendante des param\u00e8tres de localisation pour changer la casse des cha\u00eenes et des caract\u00e8res&nbsp;: les extensions <code>uppercase()<\/code>, <code>lowercase()<\/code>, <code>titlecase()<\/code>, et leurs \u00e9quivalents <code>*Char()<\/code> Vous l&#8217;avez peut-\u00eatre d\u00e9j\u00e0 essay\u00e9e <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1430.html#locale-agnostic-api-for-upper-lowercasing-text\" target=\"_blank\" rel=\"noopener\">en avant-premi\u00e8re dans la version 1.4.30<\/a>.<\/p>\n<p>Les nouvelles fonctions agissent de la m\u00eame mani\u00e8re, quels que soient les param\u00e8tres de localisation de la plateforme. Appelez simplement ces fonctions et laissez le reste \u00e0 la stdlib.<\/p>\n<p>Les nouvelles fonctions agissent de la m\u00eame mani\u00e8re, quels que soient les param\u00e8tres de localisation de la plateforme. Appelez simplement ces fonctions et laissez le reste \u00e0 la stdlib.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    \/\/ replace the old API\n    println(\"Kotlin\".toUpperCase()) \/\/ KOTLIN or KOTL\u0130N or?..\n\n    \/\/ with the new API\n    println(\"Kotlin\".uppercase()) \/\/ Always KOTLIN\n\/\/sampleEnd\n}\n<\/pre>\n<p>Sur la JVM, vous pouvez effectuer un changement de casse sensible \u00e0 la localisation en appelant les nouvelles fonctions avec la localisation actuelle comme argument&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\"Kotlin\".uppercase(Locale.getDefault()) \/\/ Locale-sensitive uppercasing\n<\/pre>\n<p>Les nouvelles fonctions remplaceront compl\u00e8tement les anciennes, qui sont maintenant obsol\u00e8tes.<\/p>\n<h2>Conversion claire des caract\u00e8res en codes et des caract\u00e8res en chiffres<\/h2>\n<p>L&#8217;op\u00e9ration permettant d&#8217;obtenir le code UTF-16 d&#8217;un caract\u00e8re, la fonction <code>toInt()<\/code>, constituait un pi\u00e8ge courant car sur des cha\u00eenes \u00e0 un chiffre elle ressemble assez \u00e0 <code>String.toInt()<\/code> qui produit un <code>Int<\/code> pr\u00e9sent\u00e9 par ce chiffre.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\"4\".toInt() \/\/ returns 4\n'4'.toInt() \/\/ returns 52\n<\/pre>\n<p>De plus, il n&#8217;existait pas de fonction g\u00e9n\u00e9rale permettant de renvoyer la valeur num\u00e9rique <code>4<\/code> pour <code>Char<\/code> <code>'4'<\/code>.<\/p>\n<p>Pour r\u00e9soudre ces probl\u00e8mes, il existe d\u00e9sormais un ensemble de nouvelles fonctions de conversion entre les caract\u00e8res et leurs codes entiers et valeurs num\u00e9riques&nbsp;:<\/p>\n<ul>\n<li><code>Char(code)<\/code> et <code>Char.code<\/code> effectuent la conversion ente un caract\u00e8re et son code.<\/li>\n<li><code>Char.digitToInt(radix: Int)<\/code> et sa version <code>*OrNull<\/code> cr\u00e9ent un entier \u00e0 partir d&#8217;un chiffre dans la base sp\u00e9cifi\u00e9e.<\/li>\n<li><code>Int.digitToChar(radix: Int)<\/code> cr\u00e9e un caract\u00e8re \u00e0 partir d&#8217;un chiffre qui repr\u00e9sente un entier dans la base sp\u00e9cifi\u00e9e.<\/li>\n<\/ul>\n<p>Ces fonctions ont des noms clairs et rendent le code plus lisible&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    val capsK = Char(75) \/\/ \u2018K\u2019\n    val one = '1'.digitToInt(10) \/\/ 1\n    val digitC = 12.digitToChar(16) \/\/ hexadecimal digit \u2018C\u2019\n\n    println(\"${capsK}otlin ${one}.5.0-R${digitC}\") \/\/ \u201cKotlin 1.5.0-RC\u201d\n    println(capsK.code) \/\/ 75\n\/\/sampleEnd\n}\n<\/pre>\n<p>Les nouvelles fonctions <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1430.html#clear-char-to-code-and-char-to-digit-conversions\" target=\"_blank\" rel=\"noopener\">\u00e9tait disponibles en avant-premi\u00e8re depuis Kotlin 1.4.30<\/a> et sont maintenant stables. Les anciennes fonctions de conversion de caract\u00e8res en nombres (<code>Char.toInt()<\/code> et fonctions similaires pour les autres types num\u00e9riques) et de conversion de nombres en caract\u00e8res (<code>Long.toChar()<\/code> et fonctions similaires sauf pour <code>Int.toChar()<\/code>) sont maintenant obsol\u00e8tes.<\/p>\n<h2>API de caract\u00e8res multiplateforme \u00e9tendue<\/h2>\n<p>Nous continuons \u00e0 \u00e9tendre la partie multiplateforme de la biblioth\u00e8que standard afin de fournir toutes ses capacit\u00e9s au code commun du projet multiplateforme.<\/p>\n<p>Nous avons rendu un certain nombre de fonctions <code>Char<\/code> disponibles sur toutes les plateformes et dans le code commun. Ces fonctions sont&nbsp;:<\/p>\n<ul>\n<li><code>Char.isDigit()<\/code>, <code>Char.isLetter()<\/code>, <code>Char.isLetterOrDigit()<\/code> qui v\u00e9rifient si un caract\u00e8re est une lettre ou un chiffre.<\/li>\n<li><code>Char.isLowerCase()<\/code>, <code>Char.isUpperCase()<\/code>, <code>Char.isTitleCase()<\/code> qui v\u00e9rifient la casse d&#8217;un caract\u00e8re.<\/li>\n<li><code>Char.isDefined()<\/code> qui v\u00e9rifie si un caract\u00e8re a une <a href=\"https:\/\/unicode.org\/reports\/tr44\/#General_Category_Values\" target=\"_blank\" rel=\"noopener\">cat\u00e9gorie g\u00e9n\u00e9rale Unicode<\/a> autre que <code>Cn<\/code> (<em>non d\u00e9fini<\/em>).<\/li>\n<li><code>Char.isISOControl()<\/code> qui v\u00e9rifie si un caract\u00e8re est un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Control_character\" target=\"_blank\" rel=\"noopener\">caract\u00e8re de contr\u00f4le ISO<\/a>, dont le code est compris dans les plages <code>\\u0000<\/code>..<code>\\u001F<\/code> ou <code>\\u007F<\/code>..<code>\\u009F<\/code>.<\/li>\n<\/ul>\n<p>La propri\u00e9t\u00e9 <code>Char.category<\/code> et son type de retour de classe enum <code>CharCategory<\/code>, qui indique la cat\u00e9gorie g\u00e9n\u00e9rale d&#8217;un caract\u00e8re selon Unicode, sont d\u00e9sormais disponibles dans les projets multiplateformes.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    val array = \"Kotlin 1.5.0-RC\".toCharArray()\n    val (letterOrDigit, punctuation) = array.partition { it.isLetterOrDigit() }\n    val (upperCase, notUpperCase ) = array.partition { it.isUpperCase() }\n\n    println(\"$letterOrDigit, $punctuation\") \/\/ [K, o, t, l, i, n, 1, 5, 0, R, C], [ , ., ., -]\n    println(\"$upperCase, $notUpperCase\") \/\/ [K, R, C], [o, t, l, i, n, , 1, ., 5, ., 0, -]\n\n    if (array[0].isDefined()) println(array[0].category)\n\/\/sampleEnd\n}\n<\/pre>\n<h2>Versions strictes de String?.toBoolean()<\/h2>\n<p>La fonction <code>String?.toBoolean()<\/code> de Kotlin est tr\u00e8s utilis\u00e9e pour cr\u00e9er des valeurs bool\u00e9ennes \u00e0 partir de cha\u00eenes. Cela fonctionne assez simplement : c&#8217;est <code>true<\/code> sur une cha\u00eene &#8220;true&#8221; quelle que soit sa casse et <code>false<\/code> sur toutes les autres cha\u00eenes, y compris <code>null<\/code>.<\/p>\n<p>Si ce comportement semble naturel, il peut cacher des erreurs potentielles. Quoi que vous convertissiez avec cette fonction, vous obtenez un bool\u00e9en m\u00eame si la cha\u00eene a une valeur inattendue.<\/p>\n<p>De nouvelles versions strictes sensibles \u00e0 la casse de <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/to-boolean.html\" target=\"_blank\" rel=\"noopener\">String?.toBoolean()<\/a> sont l\u00e0 pour \u00e9viter de telles erreurs&nbsp;:<\/p>\n<ul>\n<li><code>String.toBooleanStrict()<\/code> lance une exception pour toutes les entr\u00e9es sauf les litt\u00e9raux &#8220;true&#8221; et &#8220;false&#8221;.<\/li>\n<li><code>String.toBooleanStrictOrNull()<\/code> renvoie null pour toutes les entr\u00e9es sauf les litt\u00e9raux &#8220;true&#8221; et &#8220;false&#8221;.<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    println(\"true\".toBooleanStrict()) \/\/ True\n    \/\/ println(\"1\".toBooleanStrict()) \/\/ Exception\n    println(\"1\".toBooleanStrictOrNull()) \/\/ null\n    println(\"True\".toBooleanStrictOrNull()) \/\/ null: the function is case-sensitive\n\/\/sampleEnd\n}\n<\/pre>\n<p><a name=\"duration-api-changes\"><\/a><\/p>\n<h2>Modifications dans l&#8217;API Duration<\/h2>\n<p>L&#8217;API exp\u00e9rimentale <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/08\/kotlin-1-3-50-released\/#time-measurement-api\">mesure de la dur\u00e9e et du temps<\/a> est disponible dans la stdlib depuis la version 1.3.50. Elle fournit une API pour la mesure pr\u00e9cise d&#8217;intervalles de temps.<\/p>\n<p>L&#8217;une des principales classes de cette API est <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/\" target=\"_blank\" rel=\"noopener\"><code>Duration<\/code><\/a>. Elle repr\u00e9sente la dur\u00e9e entre deux instants de temps. Dans la version 1.5.0, <code>Duration<\/code> fait l&#8217;objet de modifications importantes, tant au niveau de l&#8217;API que de la repr\u00e9sentation interne.<\/p>\n<p><code>Duration<\/code> utilise d\u00e9sormais une valeur <code>Long<\/code> pour la repr\u00e9sentation interne au lieu de <code>Double<\/code>. La plage de valeurs <code>Long<\/code> permet de repr\u00e9senter plus de cent ans avec une pr\u00e9cision de l&#8217;ordre de la nanoseconde ou cent millions d&#8217;ann\u00e9es avec une pr\u00e9cision de l&#8217;ordre de la milliseconde. Cependant, les dur\u00e9es inf\u00e9rieures \u00e0 la nanoseconde pr\u00e9c\u00e9demment prises en charge ne sont plus disponibles.<\/p>\n<p>Nous introduisons \u00e9galement de nouvelles propri\u00e9t\u00e9s pour r\u00e9cup\u00e9rer une dur\u00e9e sous forme de valeur <code>Long<\/code>. Elles sont disponibles pour diverses unit\u00e9s de temps, notamment <code>Duration.inWholeMinutes<\/code> et <code>Duration.inWholeSeconds<\/code>. Ces fonctions viennent remplacer les propri\u00e9t\u00e9s bas\u00e9es sur <code>Double<\/code>, telles que <code>Duration.inMinutes<\/code>.<\/p>\n<p>Il y a \u00e9galement un ensemble de nouvelles fonctions d&#8217;usine pour cr\u00e9er des instances <code>Duration<\/code> \u00e0 partir de valeurs enti\u00e8res. Elles sont d\u00e9finies directement dans le type <code>Duration<\/code> et remplacent les anciennes propri\u00e9t\u00e9s d&#8217;extension des types num\u00e9riques telles que <code>Int.seconds<\/code>.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">import kotlin.time.ExperimentalTime\nimport kotlin.time.Duration\n\n@ExperimentalTime\nfun main() {\n    val duration = Duration.milliseconds(120000)\n    println(\"There are ${duration.inWholeSeconds} seconds in ${duration.inWholeMinutes} minutes\")\n}\n<\/pre>\n<p>Compte tenu de ces changements majeurs, l&#8217;ensemble de l&#8217;API de mesure de la dur\u00e9e et du temps reste exp\u00e9rimentale dans la version 1.5.0 et requiert un opt-in avec l&#8217;annotation <code>@ExperimentalTime<\/code>.<\/p>\n<p>Essayez la nouvelle version et partagez vos commentaires sur notre outil de suivi, <a href=\"https:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p><a name=\"math-operations-floordiv-mod\"><\/a><\/p>\n<h2>Op\u00e9rations math\u00e9matiques&nbsp;: division enti\u00e8re et op\u00e9rateur mod<\/h2>\n<p>Dans Kotlin, l&#8217;<a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#operations\" target=\"_blank\" rel=\"noopener\">op\u00e9rateur division (<code>\/<\/code>) sur les entiers<\/a> repr\u00e9sente la <em>division tronqu\u00e9e<\/em>, qui ne prend pas en compte la partie fractionnaire du r\u00e9sultat. En arithm\u00e9tique modulaire, il existe \u00e9galement une alternative&nbsp;: la <em>division enti\u00e8re<\/em> qui arrondit le r\u00e9sultat par le bas (vers le plus petit entier), ce qui produit un r\u00e9sultat diff\u00e9rent sur les nombres n\u00e9gatifs.<\/p>\n<p>Auparavant, la division enti\u00e8re n\u00e9cessitait une fonction personnalis\u00e9e, comme&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">fun floorDivision(i: Int, j: Int): Int {\n    var result = i \/ j\n    if (i != 0 &amp;&amp; result &lt;= 0) result--\n    return result\n}\n<\/pre>\n<p>Dans la version 1.5.0-RC, nous pr\u00e9sentons la fonction <code>floorDiv()<\/code> qui effectue des divisions enti\u00e8res sur les entiers.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    println(\"Truncated division -5\/3: ${-5 \/ 3}\")\n    println(\"Floored division -5\/3: ${(-5).floorDiv(3)}\")\n\/\/sampleEnd\n}\n<\/pre>\n<p>Dans la version 1.5.0, nous introduisons la nouvelle fonction <code>mod()<\/code>. Elle fonctionne maintenant exactement comme son nom l&#8217;indique&nbsp;: elle renvoie le <em>modulo<\/em>, qui est le reste de la division enti\u00e8re.<\/p>\n<p>Cela diff\u00e8re de l&#8217;op\u00e9rateur <code>rem()<\/code> (ou <code>%<\/code>) de Kotlin. Le modulo est la diff\u00e9rence entre <code>a<\/code> et <code>a.floorDiv(b) * b<\/code>. Le modulo non nul a toujours le m\u00eame signe que <code>b<\/code> alors que <code>a % b<\/code> peut en avoir un diff\u00e9rent. Cela peut \u00eatre utile lors de I&#8217; impl\u00e9mentation de listes cycliques&nbsp;par exemple :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-version=\"1.5.0-RC\">fun main() {\n\/\/sampleStart\n    fun getNextIndexCyclic(current: Int, size: Int ) = (current + 1).mod(size)\n    fun getPreviousIndexCyclic(current: Int, size: Int ) = (current - 1).mod(size)\n    \/\/ unlike %, mod() produces the expected non-negative value even if (current - 1) is less than 0\n\n    val size = 5\n    for (i in 0..(size * 2)) print(getNextIndexCyclic(i, size))\n    println()\n    for (i in 0..(size * 2)) print(getPreviousIndexCyclic(i, size))\n\/\/sampleEnd\n}\n<\/pre>\n<p><a name=\"collections-firstnotnullof\"><\/a><\/p>\n<h2>Collections&nbsp;: firstNotNullOf() et firstNotNullOfOrNull()<\/h2>\n<p>L&#8217;API de collections de Kotlin couvre un ensemble d&#8217;op\u00e9rations populaires sur les collections avec des fonctions int\u00e9gr\u00e9es. Pour les cas qui ne sont pas courants, vous combinez g\u00e9n\u00e9ralement les appels de ces fonctions. Cette m\u00e9thode fonctionne, mais n&#8217;est pas toujours tr\u00e8s \u00e9l\u00e9gante et peut causer une surcharge.<\/p>\n<p>Par exemple, pour obtenir le premier r\u00e9sultat non nul d&#8217;une fonction de s\u00e9lecteur sur les \u00e9l\u00e9ments de la collection, vous pouvez appeler <code>mapNotNull()<\/code> et <code>first()<\/code>. Dans la version 1.5.0, vous pouvez le faire avec un seul appel d&#8217;une nouvelle fonction <code>firstNotNullOf()<\/code>. Avec <code>firstNotNullOf()<\/code>, nous ajoutons sa contrepartie <code>*orNull()<\/code> qui produit null s&#8217;il n&#8217;y a pas de valeur \u00e0 retourner.<\/p>\n<p>Voici un exemple montrant comment raccourcir votre code avec ces fonctions.<\/p>\n<p>Supposons que vous ayez une classe avec une propri\u00e9t\u00e9 de valeur null et que vous ayez besoin de sa premi\u00e8re valeur non null dans une liste d&#8217;instances de classe.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">class Item(val name: String?)\n<\/pre>\n<p>You can implement this by iterating the collection and checking if a property is not null:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\/\/ Option 1: manual implementation\nfor (element in collection) {\n    val itemName = element.name\n    if (itemName != null) return itemName\n}\nreturn null\n<\/pre>\n<p>Il est \u00e9galement possible d&#8217;utiliser les fonctions pr\u00e9c\u00e9demment existantes <code>mapNotNull()<\/code> et <code>firstOrNull()<\/code>. Notez que <code>mapNotNull()<\/code> construit une collection interm\u00e9diaire, ce qui n\u00e9cessite de la m\u00e9moire suppl\u00e9mentaire, surtout pour les grandes collections. Ainsi, une transformation en une s\u00e9quence peut \u00e9galement \u00eatre n\u00e9cessaire ici.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\/\/ Option 2: old stdlib functions\nreturn collection\n    \/\/ .asSequence() \/\/ Avoid creating intermediate list for big collections\n    .mapNotNull { it.name }\n    .firstOrNull()\n<\/pre>\n<p>Voici le r\u00e9sultat avec la nouvelle fonction&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">\/\/ Option 3: new firstNotNullOfOrNull()\nreturn collection.firstNotNullOfOrNull { it.name }\n<\/pre>\n<p><a name=\"test-library-changes\"><\/a><\/p>\n<h2>Modifications dans la biblioth\u00e8que de tests<\/h2>\n<p>Nous n&#8217;avions pas fourni de mises \u00e0 jour majeures de la biblioth\u00e8que de tests Kotlin <code>kotlin-test<\/code> depuis plusieurs versions, mais nous apportons aujourd&#8217;hui des modifications tr\u00e8s attendues. Avec la version 1.5.0-RC, vous pouvez essayer plusieurs nouvelles fonctionnalit\u00e9s&nbsp;:<\/p>\n<ul>\n<li>D\u00e9pendance <code>kotlin-test<\/code> unique dans les projets multiplateformes.<\/li>\n<li>Choix automatique d&#8217;un framework de test pour les ensembles de sources Kotlin\/JVM.<\/li>\n<li>Mises \u00e0 jour des fonctions d&#8217;assertion.<\/li>\n<\/ul>\n<h3>D\u00e9pendance kotlin-test dans les projets multiplateformes<\/h3>\n<p>Nous poursuivons le d\u00e9veloppement du processus de configuration pour les projets multiplateformes. Dans la version 1.5.0, la mise en place d&#8217;une d\u00e9pendance sur <code>kotlin-test<\/code> pour tous les ensembles de sources est facilit\u00e9e.<\/p>\n<p>D\u00e9sormais, la d\u00e9pendance <code>kotlin-test<\/code> dans l&#8217;ensemble de sources de tests commun est la seule que vous ayez \u00e0 ajouter. Le plugin Gradle d\u00e9duira la d\u00e9pendance de la plateforme correspondante pour les autres ensembles de sources&nbsp;:<\/p>\n<ul>\n<li><code>kotlin-test-junit<\/code> pour les ensembles de sources JVM. Vous pouvez \u00e9galement passer \u00e0 <code>kotlin-test-junit-5<\/code> ou <code>kotlin-test-testng<\/code> si vous les activez explicitement (consultez la suite pour savoir comment).<\/li>\n<li><code>kotlin-test-js<\/code> pour les ensembles de sources Kotlin\/JS.<\/li>\n<li><code>kotlin-test-common<\/code> et <code>kotlin-test-annotations-common<\/code> pour les ensembles de sources communs.<\/li>\n<li>Aucun artefact suppl\u00e9mentaire pour les ensembles de sources Kotlin\/Native car Kotlin\/Native fournit des impl\u00e9mentations int\u00e9gr\u00e9es de l&#8217;API <code>kotlin-test<\/code>.<\/li>\n<\/ul>\n<h3>Choix automatique d&#8217;un framework de test pour les ensembles de sources Kotlin\/JVM<\/h3>\n<p>Une fois que vous avez sp\u00e9cifi\u00e9 la d\u00e9pendance <code>kotlin-test<\/code> dans l&#8217;ensemble de sources de tests commun tel que d\u00e9crit ci-dessus, les jeux de sources JVM re\u00e7oivent automatiquement la d\u00e9pendance sur JUnit 4. C&#8217;est tout&nbsp;! Vous pouvez \u00e9crire et ex\u00e9cuter des tests imm\u00e9diatement&nbsp;!<\/p>\n<p>Voici ce que cela donne dans le DSL Groovy :<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">kotlin {\n    sourceSets {\n        commonTest {\n            dependencies {\n                 \/\/ This brings the dependency\n                \/\/ on JUnit 4 transitively\n                implementation kotlin('test')\n            }\n        }\n    }\n}\n<\/pre>\n<p>Et dans le DSL Kotlin&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">kotlin {\n    sourceSets {\n        val commonTest by getting {\n            dependencies {\n                \/\/ This brings the dependency\n                \/\/ on JUnit 4 transitively\n                implementation(kotlin(\"test\"))\n            }\n        }\n    }\n}\n<\/pre>\n<p>Vous pouvez \u00e9galement passer \u00e0 JUnit 5 ou TestNG en appelant simplement une fonction dans la t\u00e2che de test&nbsp;: <a href=\"https:\/\/docs.gradle.org\/current\/javadoc\/org\/gradle\/api\/tasks\/testing\/Test.html#useJUnitPlatform--\" target=\"_blank\" rel=\"noopener\"><code>useJUnitPlatform()<\/code><\/a> ou <a href=\"https:\/\/docs.gradle.org\/current\/javadoc\/org\/gradle\/api\/tasks\/testing\/Test.html#useTestNG--\" target=\"_blank\" rel=\"noopener\"><code>useTestNG()<\/code><\/a>.<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">kotlin {\n    jvm {\n        testRuns[\"test\"].executionTask.configure {\n            \/\/ enable TestNG support\n            useTestNG()\n            \/\/ or\n            \/\/ enable JUnit Platform (a.k.a. JUnit 5) support\n            useJUnitPlatform()\n        }\n    }\n}\n<\/pre>\n<p>Il en va de m\u00eame dans les projets limit\u00e9s \u00e0 JVM lorsque vous ajoutez la d\u00e9pendance <code>kotlin-test<\/code>.<\/p>\n<h3>Mises \u00e0 jour des fonctions d&#8217;assertion<\/h3>\n<p>La version 1.5.0 apportera plusieurs nouvelles fonctions d&#8217;assertion, ainsi que des am\u00e9liorations des fonctions existantes.<\/p>\n<p>Passons d&#8217;abord rapidement en revue les nouvelles fonctions&nbsp;:<\/p>\n<ul>\n<li><code>assertIs&lt;T&gt;()<\/code> et <code>assertIsNot&lt;T&gt;()<\/code> v\u00e9rifient le type de la valeur.<\/li>\n<li><code>assertContentEquals()<\/code> compare le contenu du conteneur pour les tableaux, les s\u00e9quences et tout <code>Iterable<\/code>. Plus pr\u00e9cis\u00e9ment, elle v\u00e9rifie si <code>expected<\/code> et <code>actual<\/code> contiennent les m\u00eames \u00e9l\u00e9ments dans le m\u00eame ordre.<\/li>\n<li><code>assertEquals()<\/code> et <code>assertNotEquals()<\/code> pour <code>Double<\/code> et <code>Float<\/code> ont de nouvelles surcharges avec un troisi\u00e8me param\u00e8tre&nbsp;: la pr\u00e9cision.<\/li>\n<li><code>assertContains()<\/code> v\u00e9rifie la pr\u00e9sence d&#8217;un \u00e9l\u00e9ment dans tout objet dont l&#8217;op\u00e9rateur <code>contains()<\/code> est d\u00e9fini&nbsp;: tableau, liste, plage, et ainsi de suite.<\/li>\n<\/ul>\n<p>Voici un bref exemple qui illustre l&#8217;utilisation de ces fonctions&nbsp;:<\/p>\n<pre class=\"kotlin-code\" style=\"visibility: hidden; padding: 36px 0;\" data-highlight-only=\"true\">@Test\nfun test() {\n    val expectedArray = arrayOf(1, 2, 3)\n    val actualArray = Array(3) { it + 1 }\n\n    val first: Any = actualArray[0]\n    assertIs&lt;Int&gt;(first)\n    \/\/ first is smart-cast to Int now\n    println(\"${first + 1}\")\n\n    assertContentEquals(expectedArray, actualArray)\n    assertContains(expectedArray, 2)\n\n    val x = sin(PI)\n\n    \/\/ precision parameter\n    val tolerance = 0.000001\n\n    assertEquals(0.0, x, tolerance)\n}\n<\/pre>\n<p>En ce qui concerne les fonctions d&#8217;assertion existantes, il est maintenant possible d&#8217;appeler des <a href=\"https:\/\/kotlinlang.org\/docs\/composing-suspending-functions.html\" target=\"_blank\" rel=\"noopener\">suspending functions<\/a> au sein du lambda pass\u00e9 \u00e0 <code>assertTrue()<\/code>, <code>assertFalse()<\/code>, et <code>expect()<\/code> car ces fonctions sont maintenant <a href=\"https:\/\/kotlinlang.org\/docs\/inline-functions.html\" target=\"_blank\" rel=\"noopener\">inline<\/a>.<\/p>\n<h2>Essayer les nouvelles fonctionnalit\u00e9s de Kotlin 1.5.0<\/h2>\n<p>Utilisez toutes ces API Kotlin modernes pour vos projets en cours avec la version 1.5.0-RC !<\/p>\n<p>Dans IntelliJ IDEA ou Android Studio, installez le plugin Kotlin 1.5.0-RC. D\u00e9couvrez <a href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">comment obtenir les versions du plugin EAP<\/a>.<\/p>\n<p>Construisez vos projets avec 1.5.0-RC pour voir comment ils fonctionneront avec 1.5.0. Avec la <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/03\/kotlin-1-5-0-m2-released\/\">nouvelle configuration simplifi\u00e9e pour les versions preview<\/a>, il vous suffit de changer la version de Kotlin en <code>1.5.0-RC<\/code> et <a href=\"https:\/\/kotlinlang.org\/docs\/eap.html#build-details\" target=\"_blank\" rel=\"noopener\">d&#8217;ajuster les versions des d\u00e9pendances<\/a> si n\u00e9cessaire.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Installer\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Installer la version 1.5.0-RC<\/a><\/p>\n<p>Comme toujours, vous pouvez essayer la derni\u00e8re version en ligne sur <a href=\"https:\/\/play.kotlinlang.org\" target=\"_blank\" rel=\"noopener\">Kotlin Playground<\/a>.<\/p>\n<h2>Compatibilit\u00e9<\/h2>\n<p>Comme pour toutes les versions majeures, certains cycles d&#8217;obsolescence de modifications pr\u00e9c\u00e9demment annonc\u00e9es arrivent \u00e0 leur terme avec Kotlin 1.5.0. Tous ces cas ont \u00e9t\u00e9 soigneusement examin\u00e9s par le comit\u00e9 du langage et sont list\u00e9s dans le <a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-15.html\" target=\"_blank\" rel=\"noopener\">Guide de compatibilit\u00e9 pour Kotlin 1.5<\/a>. Vous pouvez \u00e9galement en savoir plus sur ces changements sur <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT?q=Tag:%20language-committee-approved%20Target%20versions:%201.5.0-RC,%201.5.0-M2,%201.5.0-M1,%201.5.0\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<h3>Notes concernant la version Release Candidate<\/h3>\n<p>Maintenant que nous en sommes \u00e0 la version release candidate de Kotlin 1.5.0, il est temps pour vous de commencer \u00e0 compiler et \u00e0 publier&nbsp;! Contrairement aux versions pr\u00e9c\u00e9dentes, il est garanti que les binaires cr\u00e9\u00e9s avec Kotlin 1.5.0-RC sont compatibles avec Kotlin 1.5.0.<\/p>\n<h2>Faites-nous part de vos commentaires<\/h2>\n<p>C&#8217;est la derni\u00e8re occasion pour vous de contribuer \u00e0 la prochaine version majeure&nbsp;! Partagez tout probl\u00e8me que vous rencontrez sur notre <a href=\"https:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">outil de suivi<\/a>. Aidez-nous \u00e0 am\u00e9liorer Kotlin 1.5.0, pour vous et pour la communaut\u00e9&nbsp;!<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Installer\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Installer la version 1.5.0-RC<\/a><\/p>\n<p><em>Auteur de l&#8217;article original en anglais : <a href=\"https:\/\/blog.jetbrains.com\/author\/pavel-semyonovjetbrains-com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Pavel Semyonov<\/a><\/em><\/p>\n","protected":false},"author":813,"featured_media":136572,"comment_status":"closed","ping_status":"closed","template":"","categories":[826],"tags":[21,6408,477,671],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/139951"}],"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=139951"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/139951\/revisions"}],"predecessor-version":[{"id":141196,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/139951\/revisions\/141196"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/136572"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=139951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=139951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=139951"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=139951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}