Sortie de Kotlin 1.7.0-bêta

Le premier aperçu de Kotlin 1.7.0 est maintenant disponible. Quelques points forts de cet aperçu :

  • Le constructeur en déduit les changements.
  • régression de la fonction d'agrégation min() et max().
  • Les types absolument non nullables sont stabilisés.
  • Nouvelle mise à jour du gestionnaire de mémoire Kotlin/Native.

Installez 1.7.0-Beta pour essayer ces fonctionnalités et signalez tout problème que vous rencontrez pour nous aider à améliorer Kotlin 1.7.0.

Nous couvrirons d'autres fonctionnalités intéressantes dans les articles de blog suivants. restez à l'écoute!

À partir de la version 1.7.0, nous avons mis à jour notre terminologie de cadence de publication : nous avons remplacé "Milestone" par "Beta". Il y a plusieurs raisons derrière cette décision :

  • Nous voulons que la terminologie de construction de Kotlin soit plus conforme à la terminologie standard du cycle de publication du logiciel . Plus précisément, "Bêta" signifie que notre travail sur l'ajout de nouvelles fonctionnalités à cette version particulière est terminé et que nous travaillons sur la stabilisation. Cependant, nous mettrons également en œuvre les modifications finales, y compris celles basées sur les commentaires des utilisateurs.
  • Il y a quelque temps, le compilateur M-release générait du code "pré-version", ce qui rend ces versions plus difficiles à tester. C'est complètement différent maintenant. Nous voulons éviter toute confusion et souligner que le processus d'essai de la version bêta de Kotlin sera simple, et l'équipe Kotlin vous encourage vivement à l'essayer.
  • Enfin et surtout, le mot "Bêta" lui-même est un appel aux commentaires de la communauté. Par ce terme, nous voulons vous faire savoir que nous voulons que vous partagiez vos commentaires avec nous.

Le constructeur déduit les changements

L'inférence de générateur est un type spécial d'inférence de type qui est utile lors de l'appel de fonctions de générateur génériques. Il aide le compilateur à déduire les arguments de type de l'appel en utilisant les informations de type pertinentes des autres appels dans ses arguments lambda.

D'autres modifications de l'inférence du constructeur sont incluses dans Kotlin 1.7.0-Beta. Ces changements stabilisent notre inférence de constructeur et clôturent l'une de nos tâches de feuille de route.

Dans cette version, l'inférence de générateur est automatiquement activée sans spécifier d' -Xenable-builder-inference option de compilateur ( que nous avons introduite dans la version 1.6.0 ) si l'inférence de type régulière ne peut pas obtenir suffisamment d'informations sur le type  .

Cela signifie que vous pouvez désormais écrire vos propres générateurs qui utilisent l'inférence de type de générateur sans appliquer d'annotations ou d'options supplémentaires. Apprenez à écrire des générateurs génériques personnalisés .

régression de la fonction d'agrégation min() et max()

Dans  Kotlin 1.4  , nous avons   renommé  la fonction min() sum  set en  sum  . Ces nouveaux noms reflètent mieux leur comportement - si la collection réceptrice est vide, elle est renvoyée  . Cela permet également d'aligner le comportement des fonctions sur les conventions de dénomination utilisées dans l'API Kotlin Collections. , ,  et max()minOrNull()maxOrNull()nullminBy()maxBy()minWith()maxWith() 

De même, chacun a son propre  *OrNull() synonyme dans Kotlin 1.4. Les fonctions plus anciennes affectées par ce changement ont été progressivement obsolètes.

Kotlin 1.7.0-Beta a réintroduit les noms de fonction d'origine, mais a ajouté un type de retour non nullable. Les mises   à  jour min(), max(), minBy(), maxBy()et  renvoient désormais strictement l'élément de collection ou lèvent une exception.minWith()maxWith()

fun main() {
    val numbers = listOf<Int>()
    println(numbers.maxOrNull()) // "null"
    println(numbers.max()) // "Exception in… Collection is empty."
}

Voir ce numéro YouTrack pour plus de détails.

Les types absolument non nullables sont stabilisés

Kotlin 1.7.0 aura des types stables absolument non nullables, qui ont été introduits dans Kotlin 1.6.20 .

Le but de l'ajout de ces types est de fournir une meilleure interopérabilité lors de l'extension des classes et des interfaces Java génériques.

Depuis Kotlin 1.6.20, vous avez pu utiliser la nouvelle syntaxe  T & Any pour marquer les paramètres de type générique comme absolument non nuls sur le site d'utilisation. Cette forme syntaxique provient de la notation de type croisé, et est maintenant restreinte à un seul paramètre de type, & avec une borne supérieure nullable à gauche et une borne non nullable à droite Any :

fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y

fun main() {
    elvisLike<String>("", "").length // OK
    elvisLike<String>("", null).length // Error: 'null' cannot be a value of a non-null type

    elvisLike<String?>(null, "").length // OK
    elvisLike<String?>(null, null).length // Error: 'null' cannot be a value of a non-null type
}

Dans cette version bêta, les types absolument non nullables seront activés par défaut. Aucune étape supplémentaire n'est requise.

En savoir plus sur les types absolument non nullables dans  KEEP  .

Expression régulière à rechercher à un emplacement spécifique

La  fonction Regex.matchAt() sum  introduite dans la version 1.5.30Regex.matchesAt()  a maintenant atteint une version stable. Ils fournissent un moyen de vérifier si une expression régulière   a une correspondance exacte à une position spécifique dans String ou  .CharSequence

  • matchesAt() Vous pouvez rechercher une correspondance et renvoyer un résultat booléen :
fun main(){
    val releaseText = "Kotlin 1.7.0 is on its way!"
    // regular expression: one digit, dot, one digit, dot, one or more digits
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()

    println(versionRegex.matchesAt(releaseText, 0)) // "false"
    println(versionRegex.matchesAt(releaseText, 7)) // "true"
}
  • matchAt()renverra une correspondance si une correspondance est trouvée, ou null si aucune correspondance n'est trouvée :
fun main(){
    val releaseText = "Kotlin 1.7.0 is on its way!"
    val versionRegex = "\\d[.]\\d[.]\\d+".toRegex()

    println(versionRegex.matchAt(releaseText, 0)) // "null"
    println(versionRegex.matchAt(releaseText, 7)?.value) // "1.7.0"
}

Nous apprécierions grandement vos commentaires sur ce numéro YouTrack .

Nouveau gestionnaire de mémoire Kotlin/Native

Nous continuerons à recueillir des commentaires et à améliorer le nouveau gestionnaire de mémoire Kotlin/Native. Actuellement, vous pouvez essayer la version Alpha dans votre projet. Kotlin 1.7.0-Beta apporte davantage d'améliorations des performances qui amélioreront l'expérience des développeurs.

Le nouveau gestionnaire de mémoire élimine les différences entre la JVM et la plate-forme native. Il offre une expérience de développement cohérente sur les projets multiplateformes. Par exemple, vous pouvez plus facilement développer de nouvelles applications mobiles multiplateformes pour les plates-formes Android et iOS.

Le nouveau gestionnaire de mémoire Kotlin/Native supprime la restriction sur le partage d'objets entre les threads. Il fournit également des primitives de langage de programmation concurrentes sans fuite qui sont sûres et ne nécessitent aucune gestion ou annotation spéciale. Le nouveau gestionnaire de mémoire sera le gestionnaire par défaut dans les prochaines versions, nous vous encourageons donc à l'essayer dès maintenant. Apprenez-en plus sur le nouveau gestionnaire de mémoire et explorez le projet de démonstration, ou passez directement aux instructions de migration pour l'essayer par vous-même.

 Essayez le nouveau gestionnaire de mémoire dans vos projets pour voir comment il fonctionne et partagez vos commentaires dans notre outil de suivi des problèmes,  YouTrack .

Prise en charge du groupe de capture nommé dans JS et natif

À partir de Kotlin 1.7.0-Beta, les groupes de capture nommés seront pris en charge non seulement sur JVM (1.8 et supérieur), mais également sur JS et Native.

(?<name>group) Pour nommer les groupes de capture, utilisez la syntaxe dans les expressions régulières  . Pour obtenir le texte correspondant à un groupe, appelez la  MatchGroupCollection.get() fonction nouvellement introduite et transmettez le nom du groupe.

Récupérer la valeur de groupe correspondante par nom

Considérez cet exemple de correspondance des coordonnées de la ville. Pour obtenir une collection de groupes correspondant à une expression régulière, utilisez  groups. Comparez en utilisant  value le numéro de groupe (index) et le nom de groupe pour récupérer le contenu d'un groupe :

fun main() {
    val regex = "\\b(?<city>[A-Za-z\\s]+),\\s(?<state>[A-Z]{2}):\\s(?<areaCode>[0-9]{3})\\b".toRegex()
    val input = "Coordinates: Austin, TX: 123"
 
    val match = regex.find(input)!!
    println(match.groups["city"]?.value) // "Austin" — by name
    println(match.groups[2]?.value) // "TX" — by number
}

référence arrière nommée

Vous pouvez désormais également utiliser des noms de groupe lorsque vous référencez des groupes à l'envers. Les références arrière correspondent au même texte qui a été précédemment mis en correspondance par le groupe de capture. \k<name> Pour cela, utilisez la syntaxe de votre expression régulière  :

fun backRef() {
    val regex = "(?<title>\\w+), yes \\k<title>".toRegex()
    val match = regex.find("Do you copy? Sir, yes Sir!")!!
    println(match.value) // "Sir, yes Sir"
    println(match.groups["title"]?.value) // "Sir"
}

Remplacer les groupes nommés dans les expressions

Enfin, les références de groupe nommé peuvent être utilisées avec des expressions de remplacement. Pensez aux fonctions qui remplacent toutes les occurrences d'expressions régulières dans l'entrée par des expressions de remplacement  replace() et aux fonctions qui permutent uniquement la première occurrence  replaceFirst() .

Chaque occurrence dans la chaîne de remplacement  ${name} est remplacée par la sous-séquence correspondant au groupe de capture avec le nom spécifié. Comparez les références de groupe par nom et par index :

fun dateReplace() {
    val dateRegex = Regex("(?<dd>\\d{2})-(?<mm>\\d{2})-(?<yyyy>\\d{4})")
    val input = "Date of birth: 27-04-2022"
    println(dateRegex.replace(input, "\${yyyy}-\${mm}-\${dd}")) // "Date of birth: 2022-04-27"  — by name
    println(dateRegex.replace(input, "\$3-\$2-\$1")) // "Date of birth: 2022-04-27" — by number
}

Essayez de nouvelles fonctionnalités et faites part de vos commentaires

Vous pouvez utiliser ces nouvelles fonctionnalités dans l'aperçu 1.7.0 Kotlin 1.7.0-Beta. Vous pouvez facilement l'installer dans  IntelliJ IDEA  ou  Android Studio  IDE.

En raison du changement de nom du plugin Android Studio (bêta), l'installation du plugin est prise en charge dans 1.6.20 et versions ultérieures.

Veuillez installer Kotlin 1.7.0-Beta soit :

  • Si vous utilisez le canal de mise à jour Early Access Preview , l'IDE proposera une mise à jour automatique vers la version 1.7.0-Beta dès qu'elle sera disponible.
  • Si vous utilisez le canal de mise à jour stable , vous pouvez  basculer vers le canal de prévisualisation à tout moment en sélectionnant Outils  |  Kotlin  |  Configurer les mises à jour du plug -in Kotlin dans votre IDE. Ensuite, vous pourrez installer la dernière version de prévisualisation. Voir ces instructions pour plus de détails.

Vous pouvez toujours télécharger les dernières versions de ces IDE pour garantir une prise en charge complète de Kotlin :

  • IntelliJ IDEA  - Pour développer des applications Kotlin pour différentes plates-formes.
  • Android Studio  - Pour développer des applications mobiles Android et multiplateformes.

N'oubliez pas de changer la .

Si vous rencontrez des problèmes :

Lire la suite

Je suppose que tu aimes

Origine www.oschina.net/news/197632/kotlin-1-7-0-beta-released
conseillé
Classement