Kotlin
A concise multiplatform language developed by JetBrains
Kotlin 1.4-M3 ya está aquí: cambios en la biblioteca estándar
Hoy nos complace presentarle la última vista previa de Kotlin 1.4 – 1.4-M3. En este artículo le mostraremos los cambios de la biblioteca estándar de Kotlin que encontrará en esta vista previa. En M3 también se han actualizado otros componentes; hablaremos de ellos pronto en otro artículo del blog, cuando lancemos la versión candidata (1.4-RC), que abarcará todo el ámbito de Kotlin 1.4.
Los cambios en la biblioteca estándar de 1.4-M3 incluyen:
- Las bibliotecas de JVM ahora incluyen el descriptor
module-info
. - interfaces funcionales a la biblioteca estándar
- Nueva colección de operaciones para cubrir casos reales
- Anotación
@Throws
en la biblioteca común - Anulación de algunas funciones en vectores de punto flotante
Se han añadido
Puede encontrar la lista completa de cambios en el registro de cambios. Como siempre, estamos enormemente agradecidos a nuestros contribuidores externos.
Le agradeceríamos mucho que probase la vista previa y nos contase sus impresiones.
Los artefactos de la biblioteca estándar ahora incluyen descriptores module-info
Desde Java 9, puede modularizar su aplicación gracias al proyecto Jigsaw. La herramienta jlink le permite generar una imagen de tiempo de ejecución de Java que contenga solo los módulos de plataforma necesarios para su aplicación. Antes ya podía utilizar jlink
con los artefactos de la biblioteca estándar Kotlin, pero tenía que usar artefactos por separado (los del clasificador "modular"), y la configuración no era demasiado sencilla. La imposibilidad de incluir descriptores de módulo en artefactos principales se debía a problemas con herramientas de Android que ahora se han resuelto.
Kotlin 1.4 añade información de módulo module-info.java
a artefactos de biblioteca estándar predeterminados, para que pueda utilizarlos fácilmente con jlink
. En Android, asegúrese de usar la versión 3.2 o superior del complemento Gradle de android, que puede procesar correctamente jars con module-info.
Interfaces fun en la biblioteca estándar
Kotlin 1.4 es compatible con conversiones SAM para clases Kotlin. Puede marcar una interfaz con un solo método abstracto como fun interface
y, a continuación, pasar un lambda como argumento cuando se espere esa interfaz como parámetro. En la biblioteca estándar, las siguientes interfaces se declaran ahora como fun interface
:
Comparator
ReadOnlyProperty
PropertyDelegateProvider
(se introdujo en 1.4-M2)
Puede utilizar un constructor SAM que tome lambda como parámetro para crear una instancia. El código resultante es mucho más simple:
<img class="alignnone size-full wp-image-55452" src="https://blog.jetbrains.com/wp-content/uploads/2020/07/fun_interface-1.png" onmouseover="this.src=’https://blog.jetbrains.com/wp-content/uploads/2020/07/fun_interface.gif‘;"
onmouseout="this.src=’https://blog.jetbrains.com/wp-content/uploads/2020/07/fun_interface-1.png‘;" alt="" />
Operaciones de colección
- Una nueva función
sumOf
toma una función de selector y devuelve una suma de sus valores en todos los elementos de una colección. Es bastante similiar a las funcionessumBy
ysumByDouble
. La principal diferencia es que la nueva funciónsumOf
toma selectores con varios tipos de retorno, de modo que puede gestionar sumas de diferentes tipos del mismo modo. Es decir, sumOf produce sumas de los tiposInt
,Long
,Double
,UInt
,ULong
. En la JVM también están disponiblesBigInteger
yBigDecimal
. -
Las funciones
min
ymax
ahora se llamanminOrNull
ymaxOrNull
. Desde su introducción en 1.0,min
ymax
han dadonull
en colecciones vacías. Esto contradice la convención de nomenclatura utilizada en las API de colecciones Kotlin: las funciones sin el sufijo*OrNull
dan una excepción si la colección receptora está vacía. Para obtener unnull
en su lugar, debía utilizar la versión*OrNull
de la función, por ejemplo,firstOrNull
.
Así pues, decidimos cambiar gradualmente el comportamiento demin
ymax
. En 1.4-M3 añadimosminOrNull
ymaxOrNull
como sinónimos demin
ymax
e iniciamos el ciclo de anulación demin
ymax
para reintroducirlos con tipos de retorno no null. -
Hemos introducido las funciones
minOf
ymaxOf
que devuelven el valor mínimo o máximo de la función selectora indicada en los elementos de la colección. Estas funciones abordan el caso en el que era necesario escribirmap { selector }.max()!!
omaxBy { selector }!!.selector
(omin
yminBy
).En pro de la coherencia con las API existentes, también añadimos
minOfWith
ymaxOfWith
, que toman unComparator
como argumento.
Las cuatro nuevas funciones siguen la convención no null que hemos descrito antes: lanzan excepciones en colecciones vacías y cuentan con versiones*OrNull
que dannull
en este caso. -
Las nuevas sobrecargas para
flatMap
yflatMapTo
le permiten usar transformaciones con tipos de retorno que no coinciden con el tipo de receptor, es decir:- transformaciones a
Sequence
enIterable
,Array
, yMap
- transformaciones a
Iterable
enSequence
- transformaciones a
-
Se ha añadido una nueva función
flatMapIndexed
como contrapartida paraflatMap
. Como quizá ya sepa,Indexed
en el nombre de una función que procesa colecciones significa que la operación aplicada tiene el elemento índice como parámetro.
Anotación @Throws común
Aunque Kotlin no tiene excepciones comprobadas, utiliza la anotación code>@Throws para la interoperabilidad con lenguajes que sí las tienen, como Java y Swift. Antes había anotaciones separadas con este nombre para JVM (kotlin.jvm.Throws
) y Native (kotlin.native.Throws
). A partir de 1.4-M3, la anotacióncode>@Throws está disponible como parte de la biblioteca común directamente en el paquete kotlin
(kotlin.Throws
), lo que le permite utilizarla en el código común.
@Throws en funciones de suspensión en Swift y Objective-C
En 1.4-M1 anunciamos cambios en el tratamiento de excepciones en la interoperabilidad de Objective-C/Swift: ahora se lanza NSError
solo para excepciones que son instancias de clases especificadas como parámetros de la anotación code>@Throws (o sus subclases). En 1.4-M2 introdujimos compatibilidad básica con las funciones de suspensión de Kotlin en Swift y Objective-C. En 1.4-M3 hay pequeños cambios en el comportamiento de funciones de suspensión anotadas con code>@Throws:
- Si ha anotado una
suspend fun
con@Throws
, tendrá que especificarCancellationException::class
como parámetro de la anotación@Throws
. De lo contrario, obtendrá un error de compilación. - Si no hay anotación
@Throws
en unasuspend fun
, esta utilizará implícitamente@Throws(CancellationException::class)
cuando la llame desde Swift.
Igualdad en vectores de punto flotante
Muchos de ustedes ya conocen estas prácticas funciones de extensión para tipos de contenedores: contains
, indexOf
y lastIndexOf
. Hace un tiempo nos dimos cuenta de que su comportamiento en vectores de punto flotante (FloatArray
y DoubleArray
) podrían crear controversia y parecer incorrectos.
Para ser más específicos, utilizan el estándar IEEE 754 en aritmética de punto flotante. Este estándar define las siguientes reglas de igualdad para casos especiales:
NaN
no es igual aNaN
-0.0
es igual a0.0
Estas reglas pueden dar lugar a resultados inesperados, por ejemplo:
Además, ese comportamiento no es coherente con cómo funcionan las mismas funciones en listas, porque usan la igualdad de orden total:
En 1.4-M3 iniciamos el ciclo de anulación de las funciones de extensión contains
, indexOf
y lastIndexOf
de FloatArray
y DoubleArray
. Al tratar de utilizarlas, verá advertencias con instrucciones sobre cómo sustituir los usos de estas funciones.
En versiones futuras, continuaremos anulando hasta el nivel ERROR
y eliminaremos estas funciones de la API pública.
Conversión de KType a Java Type
En Kotlin 1.3.40, añadimos una práctica función typeOf
a la biblioteca estándar. Esta función devuelve una representación de tiempo de ejecución del tipo reificado indicado T
como instancia de KType
. Sin embargo, en muchos casos de uso práctico, necesita trabajar con objetos Java reflection java.lang.reflect.Type
en lugar de con KType
. Ya era posible efectuar la conversión necesaria, pero esto requería utilizar la dependencia kotlin-reflect
completa. Ahora hemos actualizado la biblioteca estándar de modo que se pueda convertir KType
a Java Type
: una propiedad de extensión KType.javaType
que devuelve Java Type
:
Tenga en cuenta que, hasta ahora, el Java Type
obtenido no se comporta correctamente en algunos casos especiales (como parámetros de tipo anotado o varianza de sitio de declaración), así que KType.javaType
continúa siendo experimental. Encontrará más detalles sobre los casos no compatibles en esta incidencia.
Compatibilidad
Tenga en cuenta que Kotlin 1.4 no es compatible con versiones anteriores a 1.3 en algunos casos especiales. El comité del lenguaje ha estudiado todos esos casos y aparecerán en la “Guía de compatibilidad” (similar a esta). Por ahora, encontrará esta lista en YouTrack.
Notas previas al lanzamiento
Tenga en cuenta que las garantías de compatibilidad con versiones anteriores no cubren las versiones previas al lanzamiento. Las funcionalidades y API pueden cambiar en lanzamientos posteriores. Cuando llegamos a una RC final, el compilador expulsará todos los binarios producidos por las versiones previas al lanzamiento y se le pedirá que vuelva a compilar todo lo que compiló con la 1.4‑Mx.
Cómo probar las funcionalidades más recientes
Como siempre, puede probar Kotlin online en play.kotl.in.
En IntelliJ IDEA y Android Studio, puede actualizar el complemento de Kotlin a la versión 1.4-M3. Consulte cómo hacerlo.
Si quiere trabajar en proyectos existentes creados antes de la instalación de la versión preliminar, necesita configurar la compilación acorde a la versión preliminar en Gradle o Maven.
Puede descargar el compilador de línea de comando desde la página de lanzamiento de Github.
Puede usar las siguientes versiones de las bibliotecas publicadas junto a este lanzamiento:
- kotlinx.atomicfu versión: 0.14.3-1.4-M3
- kotlinx.coroutines versión: 1.3.7-1.4-M3
- kotlinx.serialization versión: 0.20.0-1.4-M3
- ktor versión: 1.3.2-1.4-M3
Los detalles del lanzamiento y la lista de bibliotecas compatibles también están disponibles aquí.
Comparta con nosotros sus comentarios
Le agracedemos todos sus informes de errores en nuestro sistema de seguimiento de incidencias, y haremos todo lo posible para solucionar todas las incidencias más importantes antes del lanzamiento final.
También le animamos a unirse al canal #eap en KotlinSlack (obtenga una invitación aquí). En este canal puede formular preguntas, participar en discusiones y obtener notificaciones de nuevos builds de vista previa.
¡Adelante con Kotlin!
Contribuciones externas
Nos gustaría agradecer a todos los contribuidores externos cuyas solicitudes de incorporación de cambios se han incluido en esta versión:
- Toshiaki Kameyama
- Steven Schäfer
- Jinseong Jeon
- pyos
- Mark Punzalan
- rapturemain
- Vitaly Tihonov
- Mads Ager
- Subroh Nishikori
- Juan Chen
- gcx11
- Robert Bares
- Henrik Tunedal
- Nick
- Dmitry Borodin
- Efeturi Money
- Kevin Most
- Anastasiya Krasnoryadtseva
- Kristoffer Andersen
- Martin Petrov
- Matthew Gharrity
- Mike Samuel
- Mikhail Likholetov
- Segun Famisa
- Sinan Kozak
- Vadim Semenov
- Valeriy Vyrva
- Victor Turansky
- Yuku Kotani