{"id":138778,"date":"2021-04-27T04:40:15","date_gmt":"2021-04-27T03:40:15","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=138778"},"modified":"2021-04-27T05:01:03","modified_gmt":"2021-04-27T04:01:03","slug":"lancamento-do-kotlin-1-5-0-rc-alteracoes-nas-bibliotecas-padrao-e-de-teste","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2021\/04\/lancamento-do-kotlin-1-5-0-rc-alteracoes-nas-bibliotecas-padrao-e-de-teste\/","title":{"rendered":"Lan\u00e7amento do Kotlin 1.5.0-RC: altera\u00e7\u00f5es nas Bibliotecas Padr\u00e3o e de Teste"},"content":{"rendered":"<p>O Kotlin 1.5.0-RC j\u00e1 est\u00e1 dispon\u00edvel com todos os recursos planejados para a vers\u00e3o 1.5.0: confira todo o escopo da pr\u00f3xima vers\u00e3o! Novos recursos de linguagem, atualiza\u00e7\u00f5es do stdlib, uma biblioteca de teste melhorada e muitas outras altera\u00e7\u00f5es est\u00e3o recebendo os toques finais. As \u00fanicas outras altera\u00e7\u00f5es antes do lan\u00e7amento ser\u00e3o corre\u00e7\u00f5es de bugs.<\/p>\n<\/p>\n<p>Experimente as modernas APIs do Kotlin nos seus projetos do mundo real com a vers\u00e3o 1.5.0-RC e nos ajude a deixar essa vers\u00e3o de lan\u00e7amento melhor ainda! Informe quaisquer problemas que voc\u00ea encontrar no nosso rastreador de issues <a href=\"https:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Instalar\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Instalar a vers\u00e3o 1.5.0-RC<\/a><\/p>\n<p>Neste artigo, n\u00f3s vamos apresentar o que mudou no Kotlin padr\u00e3o e nas bibliotecas de teste com a vers\u00e3o 1.5.0-RC:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#stable-unsigned-integer-types\">Tipos inteiros sem sinal est\u00e1veis<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#extensions-for-java-nio-path\">Extens\u00f5es para 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\">Melhorias nas APIs String e Char<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#duration-api-changes\">Mudan\u00e7as na 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\">Novas opera\u00e7\u00f5es matem\u00e1ticas para aritm\u00e9tica modular<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#collections-firstnotnullof\">Novas fun\u00e7\u00f5es de cole\u00e7\u00e3o<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/04\/kotlin-1-5-0-rc-released\/#test-library-changes\">Mudan\u00e7as na biblioteca de testes<\/a><\/li>\n<\/ul>\n<p>Voc\u00ea encontra todos os detalhes abaixo!<\/p>\n<p><a name = \"stable-unsigned-integer-types\"><\/a><\/p>\n<h2>Tipos inteiros sem sinal est\u00e1veis<\/h2>\n<p>A biblioteca padr\u00e3o inclui a API de inteiros sem sinal que \u00e9 \u00fatil para lidar com opera\u00e7\u00f5es de inteiros n\u00e3o negativos. Ele inclui:<\/p>\n<ul>\n<li>Tipos num\u00e9ricos sem sinal: <code>UInt<\/code>, <code>ULong<\/code>, <code>UByte<\/code>, <code>UShort<\/code> e fun\u00e7\u00f5es relacionadas, como convers\u00f5es.<\/li>\n<li>Tipos agregados: arrays, intervalos e progress\u00f5es de inteiros sem sinal:<code>UIntArray<\/code>, <code>UIntRange<\/code> e containers similares para outros tipos.<\/li>\n<\/ul>\n<p>Tipos inteiros sem sinal fazem parte da vers\u00e3o Beta desde o <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew13.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">Kotlin 1.3<\/a>. Agora estamos classificando tipos e opera\u00e7\u00f5es com inteiros sem sinal como est\u00e1veis, permitindo que estejam dispon\u00edveis sem a necessidade de confirma\u00e7\u00e3o e seguros para uso em projetos do mundo real.<\/p>\n<p>As novas APIs est\u00e1veis s\u00e3o:<\/p>\n<ul>\n<li>Tipos inteiros sem sinal<\/li>\n<li>Intervalos e progress\u00f5es de tipos inteiros sem sinal<\/li>\n<li>Fun\u00e7\u00f5es que operam com tipos inteiros sem sinal<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun 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(&quot;UInt covers the range from ${UInt.MIN_VALUE} to ${UInt.MAX_VALUE}&quot;) \/\/ UInt covers the range from 0 to 4294967295\n\/\/sampleEnd\n}\n<\/pre>\n<p>Arrays de inteiros sem sinal permanecem em Beta. Assim como <a href=\"https:\/\/kotlinlang.org\/docs\/functions.html#variable-number-of-arguments-varargs\" target=\"_blank\" rel=\"noopener\">varargs<\/a> de inteiros sem sinal que s\u00e3o implementados com arrays. Se voc\u00ea quiser us\u00e1-los no seu c\u00f3digo, voc\u00ea pode confirm\u00e1-los com a anota\u00e7\u00e3o <code>@ExperimentalUnsignedTypes<\/code>.<\/p>\n<p>Saiba mais sobre <a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#unsigned-integers\" target=\"_blank\" rel=\"noopener\">inteiros sem sinal no Kotlin<\/a>.<\/p>\n<p><a name = \"extensions-for-java-nio-path\"><\/a><\/p>\n<h2>Extens\u00f5es para a API java.nio.file.Path<\/h2>\n<p>O Kotlin agora fornece uma maneira de usar a moderna API <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/nio\/package-summary.html\" target=\"_blank\" rel=\"noopener\">Java IO n\u00e3o bloqueante<\/a> num estilo idiom\u00e1tico Kotlin pronto para uso, atrav\u00e9s de fun\u00e7\u00f5es de extens\u00e3o para <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>Eis aqui um pequeno exemplo:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport kotlin.io.path.*\nimport java.nio.file.Path\n\nfun main() {\n    \/\/ construct path with the div (\/) operator\n    val baseDir = Path(&quot;\/base&quot;)\n    val subDir = baseDir \/ &quot;subdirectory&quot;\n\n    \/\/ list files in a directory\n    val kotlinFiles = Path(&quot;\/home\/user&quot;).listDirectoryEntries(&quot;*.kt&quot;)\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>Essas extens\u00f5es foram inclu\u00eddas como um recurso experimental <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1420.html#extensions-for-java-nio-file-path\" target=\"_blank\" rel=\"noopener\">no Kotlin 1.4.20<\/a> e agora est\u00e3o dispon\u00edveis sem a necessidade de confirma\u00e7\u00e3o. D\u00ea uma olhada no pacote <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.io.path\/\" target=\"_blank\" rel=\"noopener\"><code>kotlin.io.path<\/code><\/a> para obter a lista de fun\u00e7\u00f5es que voc\u00ea pode usar.<\/p>\n<p>As extens\u00f5es existentes para a API File permanecem dispon\u00edveis, portanto voc\u00ea \u00e9 livre para escolher a API de sua prefer\u00eancia.<\/p>\n<p><a name = \"locale-agnostic-upper-lowercase\"><\/a><\/p>\n<h2>API independente de par\u00e2metros de localiza\u00e7\u00e3o para caixa-alta e caixa-baixa<\/h2>\n<p>Muitos de voc\u00eas devem estar familiarizados com as fun\u00e7\u00f5es stdlib para alterar a capitaliza\u00e7\u00e3o de strings e caracteres: <code>toUpperCase()<\/code>, <code>toLowerCase()<\/code>, <code>toTitleCase()<\/code>. Elas geralmente funcionam bem, mas podem causar dor de cabe\u00e7a quando for necess\u00e1rio lidar com par\u00e2metros de localiza\u00e7\u00e3o em plataforma diferentes: s\u00e3o todas sens\u00edveis \u00e0 localiza\u00e7\u00e3o, o que significa que o resultado poder\u00e1 variar de acordo com a plataforma de localiza\u00e7\u00e3o onde o c\u00f3digo \u00e9 executado. Por exemplo, o que voc\u00ea acha que \u00e9 retornado pela chamada <code>\u201dKotlin\u201d.toUpperCase()<\/code>? \u201c<code>KOTLIN<\/code>\u201d, \u00e9 claro, voc\u00ea diria. Mas em turco, a letra mai\u00fascula correspondente a <code>i<\/code> \u00e9 <code>\u0130<\/code>, portanto o resultado \u00e9 diferente: <code>KOTL\u0130N<\/code>.<\/p>\n<p>Agora existe uma nova API independente de localiza\u00e7\u00e3o para alterar o formato mai\u00fasculo\/min\u00fasculo de strings e caracteres: as extens\u00f5es <code>uppercase()<\/code>, <code>lowercase()<\/code>, <code>titlecase()<\/code> e suas vers\u00f5es correspondentes <code>*Char()<\/code>. Voc\u00ea talvez j\u00e1 tenha experimentado <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1430.html#locale-agnostic-api-for-upper-lowercasing-text\" target=\"_blank\" rel=\"noopener\">a pr\u00e9via desses recursos na vers\u00e3o 1.4.30<\/a>.<\/p>\n<p>As novas fun\u00e7\u00f5es funcionam de forma igual, independentemente das configura\u00e7\u00f5es de localiza\u00e7\u00e3o da plataforma. Basta chamar as fun\u00e7\u00f5es e deixar o resto para o stdlib.<\/p>\n<p>As novas fun\u00e7\u00f5es funcionam de forma igual, independentemente das configura\u00e7\u00f5es de localiza\u00e7\u00e3o da plataforma. Basta chamar as fun\u00e7\u00f5es e deixar o resto para o stdlib.<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n\/\/sampleStart\n    \/\/ replace the old API\n    println(&quot;Kotlin&quot;.toUpperCase()) \/\/ KOTLIN or KOTL\u0130N or?..\n\n    \/\/ with the new API\n    println(&quot;Kotlin&quot;.uppercase()) \/\/ Always KOTLIN\n\/\/sampleEnd\n}\n<\/pre>\n<p>Na JVM, voc\u00ea pode realizar altera\u00e7\u00f5es entre mai\u00fasculas e min\u00fasculas levando em conta os par\u00e2metros de localiza\u00e7\u00e3o ao chamar as novas fun\u00e7\u00f5es passando a localiza\u00e7\u00e3o atual como argumento:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n&quot;Kotlin&quot;.uppercase(Locale.getDefault()) \/\/ Locale-sensitive uppercasing\n<\/pre>\n<p>As novas fun\u00e7\u00f5es dever\u00e3o substituir completamente as antigas, que estamos agora marcando como deprecadas.<\/p>\n<h2>Convers\u00f5es leg\u00edveis de caractere para c\u00f3digo e de caractere para d\u00edgito<\/h2>\n<p>A opera\u00e7\u00e3o que retorna o c\u00f3digo UTF-16 de um caractere &#8211; a fun\u00e7\u00e3o <code>toInt()<\/code> &#8211; era uma armadilha comum porque ela parece muito com <code>String.toInt()<\/code> usada em strings de um d\u00edgito, que produz um <code>Int<\/code> apresentado por este d\u00edgito.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n&quot;4&quot;.toInt() \/\/ returns 4\n'4'.toInt() \/\/ returns 52\n<\/pre>\n<p>Al\u00e9m disso, n\u00e3o havia uma fun\u00e7\u00e3o comum que retornasse o valor num\u00e9rico <code>4<\/code> para <code>Char<\/code> <code>'4'<\/code>.<\/p>\n<p>Para solucionar essas quest\u00f5es, agora existe um conjunto de novas fun\u00e7\u00f5es para convers\u00e3o entre caracteres e seus c\u00f3digos inteiros e valores num\u00e9ricos:<\/p>\n<ul>\n<li><code>Char(code)<\/code> e <code>Char.code<\/code> convertem entre um char e seu c\u00f3digo.<\/li>\n<li><code>Char.digitToInt(radix: Int)<\/code> e sua vers\u00e3o <code>*OrNull<\/code> criam um inteiro a partir de um d\u00edgito na base especificada.<\/li>\n<li><code>Int.digitToChar(radix: Int)<\/code> cria um caractere de um d\u00edgito que representa um inteiro na base especificada.<\/li>\n<\/ul>\n<p>Essas fun\u00e7\u00f5es t\u00eam nomes claros e deixam o c\u00f3digo mais leg\u00edvel:<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun 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(&quot;${capsK}otlin ${one}.5.0-R${digitC}&quot;) \/\/ \u201cKotlin 1.5.0-RC\u201d\n    println(capsK.code) \/\/ 75\n\/\/sampleEnd\n}\n<\/pre>\n<p>As novas fun\u00e7\u00f5es <a href=\"https:\/\/kotlinlang.org\/docs\/whatsnew1430.html#clear-char-to-code-and-char-to-digit-conversions\" target=\"_blank\" rel=\"noopener\">est\u00e3o dispon\u00edveis desde o Kotlin 1.4.30<\/a>, no modo de pr\u00e9-visualiza\u00e7\u00e3o, mas agora s\u00e3o fun\u00e7\u00f5es est\u00e1veis. As antigas fun\u00e7\u00f5es para convers\u00e3o de caractere para n\u00famero (<code>Char.toInt()<\/code> e fun\u00e7\u00f5es similares para outros tipos num\u00e9ricos) e convers\u00e3o de n\u00famero para caractere (<code>Long.toChar()<\/code> e similares, exceto <code>Int.toChar()<\/code>) agora est\u00e3o deprecadas.<\/p>\n<h2>API de caracteres multiplataforma estendida<\/h2>\n<p>Continuamos a estender a parte multiplataforma da biblioteca padr\u00e3o para que todos os seus recursos fa\u00e7am parte do c\u00f3digo comum do projeto multiplataforma.<\/p>\n<p>Agora, disponibilizamos v\u00e1rias fun\u00e7\u00f5es <code>Char<\/code> em todas as plataformas e em c\u00f3digo comum. Estas fun\u00e7\u00f5es s\u00e3o:<\/p>\n<ul>\n<li><code>Char.isDigit()<\/code>, <code>Char.isLetter()<\/code>, <code>Char.isLetterOrDigit()<\/code> que verificam se um caractere \u00e9 uma letra ou um d\u00edgito.<\/li>\n<li><code>Char.isLowerCase()<\/code>, <code>Char.isUpperCase()<\/code>, <code>Char.isTitleCase()<\/code> que verificam o formato mai\u00fasculo\/min\u00fasculo de um caractere.<\/li>\n<li><code>Char.isDefined()<\/code> que verifica se um caractere tem uma <a href=\"https:\/\/unicode.org\/reports\/tr44\/#General_Category_Values\" target=\"_blank\" rel=\"noopener\">categoria geral Unicode<\/a> diferente de <code>Cn<\/code> (<em>undefined<\/em>).<\/li>\n<li><code>Char.isISOControl()<\/code> que verifica se um caractere \u00e9 um <a href=\"https:\/\/en.wikipedia.org\/wiki\/Control_character\" target=\"_blank\" rel=\"noopener\">caractere de controle ISO<\/a>, que possui c\u00f3digo nos intervalos<code>\\u0000<\/code>..<code>\\u001F<\/code> ou <code>\\u007F<\/code>..<code>\\u009F<\/code>.<\/li>\n<\/ul>\n<p>A propriedade <code>Char.category<\/code> e seu tipo de retorno de classe enum <code>CharCategory<\/code>, que indica a categoria geral de um caractere de acordo com o Unicode, agora est\u00e3o dispon\u00edveis nos projetos multiplataforma.<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n\/\/sampleStart\n    val array = &quot;Kotlin 1.5.0-RC&quot;.toCharArray()\n    val (letterOrDigit, punctuation) = array.partition { it.isLetterOrDigit() }\n    val (upperCase, notUpperCase ) = array.partition { it.isUpperCase() }\n\n    println(&quot;$letterOrDigit, $punctuation&quot;) \/\/ [K, o, t, l, i, n, 1, 5, 0, R, C], [ , ., ., -]\n    println(&quot;$upperCase, $notUpperCase&quot;) \/\/ [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>Vers\u00f5es estritas de String?.toBoolean()<\/h2>\n<p>A fun\u00e7\u00e3o <code>String?.toBoolean()<\/code> do Kotlin \u00e9 amplamente usada para criar valores booleanos a partir de strings. Seu funcionamento \u00e9 bastante simples: seu valor \u00e9 <code>true<\/code> para a string &#8220;true&#8221;, independente se estiver em letras mai\u00fasculas ou min\u00fasculas, e <code>false<\/code> para todas as outras strings, inclusive <code>null<\/code>.<\/p>\n<p>Embora esse comportamento pare\u00e7a natural, ele pode ocultar situa\u00e7\u00f5es potencialmente incorretas. O que quer que voc\u00ea converta com esta fun\u00e7\u00e3o, voc\u00ea obter\u00e1 um booleano mesmo se a string tiver algum valor inesperado.<\/p>\n<p>Novas vers\u00f5es estritas que diferenciam mai\u00fasculas de min\u00fasculas de <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.text\/to-boolean.html\" target=\"_blank\" rel=\"noopener\">String?.toBoolean()<\/a> foram criadas para ajudar a evitar esses erros:<\/p>\n<ul>\n<li><code>String.toBooleanStrict()<\/code> lan\u00e7a uma exce\u00e7\u00e3o para todas as entradas, exceto as literais &#8220;true&#8221; e &#8220;false&#8221;.<\/li>\n<li><code>String.toBooleanStrictOrNull()<\/code> retorna null para todas as entradas, exceto literais &#8220;true&#8221; e &#8220;false&#8221;.<\/li>\n<\/ul>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n\/\/sampleStart\n    println(&quot;true&quot;.toBooleanStrict()) \/\/ True\n    \/\/ println(&quot;1&quot;.toBooleanStrict()) \/\/ Exception\n    println(&quot;1&quot;.toBooleanStrictOrNull()) \/\/ null\n    println(&quot;True&quot;.toBooleanStrictOrNull()) \/\/ null: the function is case-sensitive\n\/\/sampleEnd\n}\n<\/pre>\n<p><a name = \"duration-api-changes\"><\/a><\/p>\n<h2>Mudan\u00e7as na API Duration<\/h2>\n<p>A API experimental <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/08\/kotlin-1-3-50-released\/#time-measurement-api\">Duration and Time Measurement<\/a> faz parte da stdlib desde a vers\u00e3o 1.3.50. Ela oferece uma API para a medi\u00e7\u00e3o precisa de intervalos de tempo.<\/p>\n<p>Uma das principais classes desta API \u00e9 <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.time\/-duration\/\" target=\"_blank\" rel=\"noopener\"><code>Duration<\/code><\/a>. Ela representa a quantidade de tempo entre dois instantes de tempo. Na vers\u00e3o 1.5.0, <code>Duration<\/code> ganha mudan\u00e7as significativas tanto na API quanto na representa\u00e7\u00e3o interna.<\/p>\n<p><code>Duration<\/code> agora usa um valor <code>Long<\/code> para a representa\u00e7\u00e3o interna, em vez de <code>Double<\/code>. O intervalo de valores <code>Long<\/code> permite representar mais de cem anos com precis\u00e3o de nanossegundos ou cem milh\u00f5es de anos com precis\u00e3o de milissegundos. No entanto, as dura\u00e7\u00f5es de fra\u00e7\u00f5es de nanosegundos suportadas anteriormente n\u00e3o est\u00e3o mais dispon\u00edveis.<\/p>\n<p>Tamb\u00e9m introduzimos novas propriedades para recuperar uma dura\u00e7\u00e3o como um valor <code>Long<\/code>. Elas est\u00e3o dispon\u00edveis para diversas unidades de tempo:<code>Duration.inWholeMinutes<\/code>, <code>Duration.inWholeSeconds<\/code> e outras. Essas fun\u00e7\u00f5es vieram substituir as propriedades baseadas em <code>Double<\/code>, como <code>Duration.inMinutes<\/code>.<\/p>\n<p>Outra mudan\u00e7a \u00e9 um conjunto de novas fun\u00e7\u00f5es de f\u00e1brica para criar inst\u00e2ncias de <code>Duration<\/code> a partir de valores inteiros. Elas s\u00e3o definidas diretamente no tipo <code>Duration<\/code> e substituem as antigas propriedades de extens\u00e3o de tipos num\u00e9ricos como <code>Int.seconds<\/code>.<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nimport kotlin.time.ExperimentalTime\nimport kotlin.time.Duration\n\n@ExperimentalTime\nfun main() {\n    val duration = Duration.milliseconds(120000)\n    println(&quot;There are ${duration.inWholeSeconds} seconds in ${duration.inWholeMinutes} minutes&quot;)\n}\n<\/pre>\n<p>Dadas essas mudan\u00e7as importantes, toda a API Duration and Time Measurement permanece experimental na vers\u00e3o 1.5.0 e requer confirma\u00e7\u00e3o atrav\u00e9s da anota\u00e7\u00e3o <code>@ExperimentalTime<\/code>.<\/p>\n<p>Por favor, experimente a nova vers\u00e3o e compartilhe seus coment\u00e1rios no nosso rastreador de issues, <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>Opera\u00e7\u00f5es matem\u00e1ticas: divis\u00e3o arredondada para baixo (fun\u00e7\u00e3o piso) e o operador mod<\/h2>\n<p>No Kotlin, o <a href=\"https:\/\/kotlinlang.org\/docs\/basic-types.html#operations\" target=\"_blank\" rel=\"noopener\">operador de divis\u00e3o (<code>\/<\/code>) em inteiros <\/a> representa a <em>divis\u00e3o truncada<\/em>, que despreza a parte fracion\u00e1ria do resultado. Na aritm\u00e9tica modular, h\u00e1 tamb\u00e9m uma alternativa: a <em>divis\u00e3o arredondada para baixo<\/em> (fun\u00e7\u00e3o piso) que converte o resultado para o menor valor inteiro, produzindo um resultado diferente em n\u00fameros negativos.<\/p>\n<p>Anteriormente, a divis\u00e3o arredondada para baixo necessitava de uma fun\u00e7\u00e3o personalizada como:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun 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>Na vers\u00e3o 1.5.0-RC, apresentamos a fun\u00e7\u00e3o <code>floorDiv()<\/code> que realiza a divis\u00e3o arredondada para baixo em inteiros.<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n\/\/sampleStart\n    println(&quot;Truncated division -5\/3: ${-5 \/ 3}&quot;)\n    println(&quot;Floored division -5\/3: ${(-5).floorDiv(3)}&quot;)\n\/\/sampleEnd\n}\n<\/pre>\n<p>Na vers\u00e3o 1.5.0, introduzimos a nova fun\u00e7\u00e3o <code>mod()<\/code>. Ela agora funciona exatamente como o nome sugere: retorna o <em>m\u00f3dulo<\/em>, que \u00e9 o resto da divis\u00e3o arredondada para baixo.<\/p>\n<p>Ela difere da fun\u00e7\u00e3o <code>rem()<\/code>, do Kotlin (ou operador <code>%<\/code>). O m\u00f3dulo \u00e9 a diferen\u00e7a entre <code>a<\/code> e <code>a.floorDiv(b) * b<\/code>. O m\u00f3dulo diferente de zero sempre ter\u00e1 o mesmo sinal que <code>b<\/code> enquanto que <code>a % b<\/code> pode ter um sinal diferente. Isto pode ser \u00fatil, por exemplo, para implementar listas c\u00edclicas:<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.5.0-RC\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun 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>Cole\u00e7\u00f5es: firstNotNullOf() e firstNotNullOfOrNull()<\/h2>\n<p>A API de cole\u00e7\u00f5es Kotlin cobre uma variedade de opera\u00e7\u00f5es populares em cole\u00e7\u00f5es com fun\u00e7\u00f5es integradas. Para os casos que n\u00e3o s\u00e3o comuns, voc\u00ea geralmente combina chamadas dessas fun\u00e7\u00f5es. Isto funciona, mas nem sempre fica muito elegante e pode causar sobrecarga.<\/p>\n<p>Por exemplo, para obter o primeiro resultado n\u00e3o nulo de uma fun\u00e7\u00e3o de seletor nos elementos da cole\u00e7\u00e3o, voc\u00ea chamaria <code>mapNotNull()<\/code> e <code>first()<\/code>. Na vers\u00e3o 1.5.0, voc\u00ea pode fazer isso com uma \u00fanica chamada da nova fun\u00e7\u00e3o <code>firstNotNullOf()<\/code>. Junto com <code>firstNotNullOf()<\/code>, estamos acrescentando sua contraparte <code>*orNull()<\/code> que produz null se n\u00e3o houver nenhum valor a retornar.<\/p>\n<p>Eis aqui um exemplo de como ele pode ser usado para encurtar seu c\u00f3digo.<\/p>\n<p>Suponha que voc\u00ea tenha uma classe com uma propriedade anul\u00e1vel e precise do seu primeiro valor n\u00e3o nulo dentro de uma lista de inst\u00e2ncias de classe.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nclass 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\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n\/\/ 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>Outra maneira \u00e9 usar as fun\u00e7\u00f5es que j\u00e1 existem <code>mapNotNull()<\/code> e <code>firstOrNull()<\/code>. Observe que <code>mapNotNull()<\/code> constr\u00f3i uma cole\u00e7\u00e3o intermedi\u00e1ria, que requer mem\u00f3ria adicional, especialmente em cole\u00e7\u00f5es grandes. Ent\u00e3o a transforma\u00e7\u00e3o em sequ\u00eancia pode tamb\u00e9m ser necess\u00e1ria aqui.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n\/\/ 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>E \u00e9 assim que fica com a nova fun\u00e7\u00e3o:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n\/\/ Option 3: new firstNotNullOfOrNull()\nreturn collection.firstNotNullOfOrNull { it.name }\n<\/pre>\n<p><a name = \"test-library-changes\"><\/a><\/p>\n<h2>Mudan\u00e7as na biblioteca de testes<\/h2>\n<p>Faz v\u00e1rios lan\u00e7amentos que n\u00e3o inclu\u00edmos atualiza\u00e7\u00f5es importantes na biblioteca de testes do Kotlin <code>kotlin-test<\/code>, mas agora estamos entregando algumas mudan\u00e7as h\u00e1 muito esperadas. Com a vers\u00e3o 1.5.0-RC, voc\u00ea pode experimentar uma s\u00e9rie de novos recursos:<\/p>\n<ul>\n<li>Uma \u00fanica depend\u00eancia <code>kotlin-test<\/code> em projetos multiplataforma.<\/li>\n<li>Escolha autom\u00e1tica de um framework de testes para conjuntos de fontes Kotlin\/JVM.<\/li>\n<li>Atualiza\u00e7\u00f5es nas fun\u00e7\u00f5es de asser\u00e7\u00e3o.<\/li>\n<\/ul>\n<h3>Depend\u00eancia kotlin-test em projetos multiplataforma<\/h3>\n<p>Estamos continuando nosso desenvolvimento do processo de configura\u00e7\u00e3o para projetos multiplataforma. Na vers\u00e3o 1.5.0, tornamos mais f\u00e1cil configurar uma depend\u00eancia do <code>kotlin-test<\/code> para todos os conjuntos de fontes.<\/p>\n<p>Agora, a depend\u00eancia <code>kotlin-test<\/code> no conjunto de fontes de teste comum \u00e9 a \u00fanica que voc\u00ea precisa adicionar. O plug-in Gradle ir\u00e1 inferir a depend\u00eancia de plataforma correspondente para outros conjuntos de fontes:<\/p>\n<ul>\n<li><code>kotlin-test-junit<\/code> para conjuntos de fontes JVM. Voc\u00ea tamb\u00e9m pode mudar para <code>kotlin-test-junit-5<\/code> ou <code>kotlin-test-testng<\/code> se voc\u00ea ativ\u00e1-los explicitamente (continue lendo para saber como).<\/li>\n<li><code>kotlin-test-js<\/code> para conjuntos de fontes Kotlin\/JS.<\/li>\n<li><code>kotlin-test-common<\/code> e <code>kotlin-test-annotations-common<\/code> para conjuntos de fontes comuns.<\/li>\n<li>N\u00e3o h\u00e1 um artefato extra para conjuntos de fontes Kotlin\/Native porque Kotlin\/Native fornece implementa\u00e7\u00f5es integradas da API <code>kotlin-test<\/code>.<\/li>\n<\/ul>\n<h3>Escolha autom\u00e1tica de um framework de testes para conjuntos de fontes Kotlin\/JVM<\/h3>\n<p>Depois de especificar a depend\u00eancia <code>kotlin-test<\/code> no conjunto de fontes de teste comum, conforme descrito acima, os conjuntos de fontes da JVM recebem automaticamente a depend\u00eancia do JUnit 4. \u00c9 isso! Voc\u00ea pode escrever e executar os testes imediatamente!<\/p>\n<p>\u00c9 assim que fica no Groovy DSL:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nkotlin {\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>\n<p>E no Kotlin DSL fica assim:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nkotlin {\n    sourceSets {\n        val commonTest by getting {\n            dependencies {\n                \/\/ This brings the dependency\n                \/\/ on JUnit 4 transitively\n                implementation(kotlin(&quot;test&quot;))\n            }\n        }\n    }\n}\n<\/pre>\n<p>Voc\u00ea tamb\u00e9m pode mudar para o JUnit 5 ou TestNG simplesmente chamando uma fun\u00e7\u00e3o na tarefa de teste: <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\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nkotlin {\n    jvm {\n        testRuns[&quot;test&quot;].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>O mesmo funciona em projetos JVM puros quando voc\u00ea adiciona a depend\u00eancia <code>kotlin-test<\/code>.<\/p>\n<h3>Atualiza\u00e7\u00f5es nas fun\u00e7\u00f5es de asser\u00e7\u00e3o<\/h3>\n<p>Para a vers\u00e3o 1.5.0, preparamos uma s\u00e9rie de novas fun\u00e7\u00f5es de asser\u00e7\u00e3o, juntamente com melhorias nas existentes.<\/p>\n<p>Primeiro, vamos dar uma olhada nas novas fun\u00e7\u00f5es:<\/p>\n<ul>\n<li><code>assertIs&lt;T&gt;()<\/code> e <code>assertIsNot&lt;T&gt;()<\/code> verificam o tipo do valor.<\/li>\n<li><code>assertContentEquals()<\/code> compara o conte\u00fado do cont\u00eainer para vetores, sequ\u00eancias e qualquer <code>Iterable<\/code>. Mais precisamente, ele verifica se <code>expected<\/code> e <code>actual<\/code> cont\u00eam os mesmos elementos na mesma ordem.<\/li>\n<li><code>assertEquals()<\/code> e <code>assertNotEquals()<\/code> para <code>Double<\/code> e <code>Float<\/code> t\u00eam novas sobrecargas com um terceiro par\u00e2metro: precis\u00e3o.<\/li>\n<li><code>assertContains()<\/code> verifica a presen\u00e7a de um item em qualquer objeto com o operador <code>contains()<\/code> definido: array, lista, intervalo, etc.<\/li>\n<\/ul>\n<p>Aqui est\u00e1 um breve exemplo que mostra o uso dessas fun\u00e7\u00f5es:<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n@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(&quot;${first + 1}&quot;)\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>Em rela\u00e7\u00e3o \u00e0s fun\u00e7\u00f5es de asser\u00e7\u00e3o existentes, agora \u00e9 poss\u00edvel chamar <a href=\"https:\/\/kotlinlang.org\/docs\/composing-suspending-functions.html\" target=\"_blank\" rel=\"noopener\">suspending functions<\/a> dentro do lambda, que s\u00e3o passadas para <code>assertTrue()<\/code>, <code>assertFalse()<\/code> e <code>expect()<\/code> porque essas fun\u00e7\u00f5es agora s\u00e3o <a href=\"https:\/\/kotlinlang.org\/docs\/inline-functions.html\" target=\"_blank\" rel=\"noopener\">inline<\/a>.<\/p>\n<h2>Experimente todos os recursos do Kotlin 1.5.0<\/h2>\n<p>Traga todas essas APIs modernas do Kotlin para seus projetos do mundo real com a vers\u00e3o 1.5.0-RC!<\/p>\n<p>No IntelliJ IDEA e no Android Studio, instale o Kotlin Plugin vers\u00e3o 1.5.0-RC. Saiba <a href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">como obter as vers\u00f5es EAP do plugin<\/a>.<\/p>\n<p>Construa seus projetos existentes com a vers\u00e3o 1.5.0-RC para saber como eles ir\u00e3o funcionar na vers\u00e3o 1.5.0. Com a <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/03\/kotlin-1-5-0-m2-released\/\">nova configura\u00e7\u00e3o simplificada para vers\u00f5es de pr\u00e9-visualiza\u00e7\u00e3o<\/a>, voc\u00ea s\u00f3 precisa alterar a vers\u00e3o do Kotlin para <code>1.5.0-RC<\/code> e <a href=\"https:\/\/kotlinlang.org\/docs\/eap.html#build-details\" target=\"_blank\" rel=\"noopener\">ajustar as vers\u00f5es das depend\u00eancias<\/a>, se necess\u00e1rio.<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Instalar\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Instalar a vers\u00e3o 1.5.0-RC<\/a><\/p>\n<p>Como sempre, voc\u00ea pode experimentar a mais recente vers\u00e3o online no <a href=\"https:\/\/play.kotlinlang.org\" target=\"_blank\" rel=\"noopener\">Kotlin Playground<\/a>.<\/p>\n<h2>Compatibilidade<\/h2>\n<p>Como em todos os lan\u00e7amentos de recursos, alguns ciclos de descontinua\u00e7\u00e3o de altera\u00e7\u00f5es previamente anunciadas estar\u00e3o chegando ao fim com o Kotlin 1.5.0. Todas essas situa\u00e7\u00f5es foram cuidadosamente revisadas pelo comit\u00ea de linguagens e est\u00e3o listados no <a href=\"https:\/\/kotlinlang.org\/docs\/compatibility-guide-15.html\" target=\"_blank\" rel=\"noopener\">Guia de Compatibilidade para Kotlin 1.5<\/a>. Voc\u00ea tamb\u00e9m pode explorar essas mudan\u00e7as no <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>Notas sobre o lan\u00e7amento<\/h3>\n<p>Agora que chegamos ao release candidate final para o Kotlin 1.5.0, \u00e9 hora de come\u00e7ar a compilar e publicar! Diferentemente dos lan\u00e7amentos de milestone anteriores, bin\u00e1rios criados com o Kotlin 1.5.0-RC t\u00eam garantia de compatibilidade com o Kotlin 1.5.0.<\/p>\n<h2>Compartilhe suas opini\u00f5es<\/h2>\n<p>Esta \u00e9 a sua \u00faltima oportunidade de influenciar o pr\u00f3ximo lan\u00e7amento! Compartilhe quaisquer problemas que voc\u00ea encontrar conosco, usando o <a href=\"https:\/\/kotl.in\/issue\" target=\"_blank\" rel=\"noopener\">rastreador de issues<\/a>. Fa\u00e7a com que o Kotlin 1.5.0 seja melhor para voc\u00ea e para a comunidade!<\/p>\n<p align=\"center\"><a class=\"jb-download-button\" title=\"Instalar\" href=\"https:\/\/kotlinlang.org\/docs\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">Instalar a vers\u00e3o 1.5.0-RC<\/a><\/p>\n","protected":false},"author":1086,"featured_media":136572,"comment_status":"closed","ping_status":"closed","template":"","categories":[4113,907],"tags":[21,6408,477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/138778"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=138778"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/138778\/revisions"}],"predecessor-version":[{"id":138781,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/138778\/revisions\/138781"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/136572"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=138778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=138778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=138778"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=138778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}