Kotlin 1.4-M3 ya está aquí: cambios en la biblioteca estándar

Publicado el por luizdibella

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:

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 funciones sumBy y sumByDouble. La principal diferencia es que la nueva función sumOf 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 tipos Int, Long, Double, UInt, ULong. En la JVM también están disponibles BigInteger y BigDecimal.
  • Las funciones min y max ahora se llaman minOrNull y maxOrNull. Desde su introducción en 1.0, min y max han dado null 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 un null en su lugar, debía utilizar la versión *OrNull de la función, por ejemplo, firstOrNull.
    Así pues, decidimos cambiar gradualmente el comportamiento de min y max. En 1.4-M3 añadimos minOrNull y maxOrNull como sinónimos de min y max e iniciamos el ciclo de anulación de min y max para reintroducirlos con tipos de retorno no null.
  • Hemos introducido las funciones minOf y maxOf 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 escribir map { selector }.max()!! o maxBy { selector }!!.selector (o min y minBy).

    En pro de la coherencia con las API existentes, también añadimos minOfWith y maxOfWith, que toman un Comparator 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 dan null en este caso.

  • Las nuevas sobrecargas para flatMap y flatMapTo le permiten usar transformaciones con tipos de retorno que no coinciden con el tipo de receptor, es decir:

    • transformaciones a Sequence en Iterable, Array, y Map
    • transformaciones a Iterable en Sequence
  • Se ha añadido una nueva función flatMapIndexed como contrapartida para flatMap. 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 especificar CancellationException::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 una suspend 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 a NaN
  • -0.0 es igual a 0.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:

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: