Conceptos básicos de progtwigción de Kotlin

Intento aprender a Kotlin y me surge una pregunta cuando uso las funciones.

fun main(args: Array<String>) { println(max(20, 10)) } fun max(a: Int, b: Int) = if (a > b) a else b 

Aquí tengo una function MAX. Ahora hay alguna diferencia entre la implementación anterior y la implementación inferior de la function MAX, aunque ambos dan el mismo resultado.

 fun max(a: Int, b: Int): Int?{ if(a > b) return a else return b } 

Usted tiene tres diferencias principales entre las dos funciones:

  1. El tipo de devolución es diferente (como voddan ha señalado).
  2. El estilo del cuerpo es diferente (esto es solo azúcar sintáctica).
  3. El bytecode de la primera function es más eficiente.

El tipo de devolución

Kotlin tiene types anulables y types no nulos . Int se puede utilizar en el código de Kotlin como nulable, Int? , o no nulo, Int , y en la JVM están mapeados en Integer e int respectivamente.

El estilo del cuerpo

Las funciones de expresión simple en Kotlin se pueden declarar de forma más concisa usando un cuerpo de expresión (a diferencia del cuerpo de bloque normal). Los siguientes generan el mismo bytecode:

Estilo de cuerpo de expresión

 fun max(a: Int, b: Int) = if (a > b) a else b 

El tipo de devolución también se puede declarar explícitamente:

 fun max(a: Int, b: Int): Int = if (a > b) a else b 

Estilo de cuerpo de bloque

 fun max(a: Int, b: Int): Int { return if (a > b) a else b } 

El bytecode

El bytecode de la primera function carga el valor en function de la condición y luego devuelve el valor cargado mientras que el bytecode de la segunda function declara dos bloques, cada uno definiendo su propia carga y retorno, lo que da como resultado un bytecode más generado.

  L0 LINENUMBER 8 L0 ILOAD 0 ILOAD 1 IF_ICMPLE L1 ILOAD 0 GOTO L2 L1 ILOAD 1 L2 IRETURN 

vs.

  L0 LINENUMBER 8 L0 ILOAD 0 ILOAD 1 IF_ICMPLE L1 L2 LINENUMBER 9 L2 ILOAD 0 IRETURN L3 L1 LINENUMBER 11 L1 ILOAD 1 IRETURN 

La única diferencia es el tipo de devolución: es Int en el primer caso, e Int? en el segundo caso

Esa diferencia te afecta de 2 maneras:

1) El código que usa max en el segundo caso no puede saber si devuelve null o no, por lo que debe verificarlo siempre (con if-else u otras técnicas)

2) El código de bytes subyacente para el 1er caso (suponiendo que uses el backend de JVM) utiliza Integer primitivo, no encuadrado Integer . Esto puede darle un aumento de performance significativo.

  • Mockito con Kotlin probando la falla asincrónica
  • Asignar un solo elemento a un atributo de valor IntArray en las annotations de Kotlin
  • Los elementos de tipo 'subs' no se pueden consumir. respuesta: -1010: bash de consumo no válido
  • Inicie la actividad de superposition sin mostrar el rest de la aplicación
  • Prueba de unidad de complemento IDEA Intellij (dependencies de proyecto de testing)
  • Kotlin setOnclickListener
  • Configuración de alto y ancho de una vista Anko para match_parent
  • kapt - java.lang.OutOfMemoryError: límite superior de GC excedido
  • Kotlin delegar propiedad por perezoso que es hilo local
  • Kotlin: ¿Cómo puedo evitar el autoboxing (basura) en las properties delegadas?
  • groupValues ​​solo devuelve la última aparición de patrón repetitivo