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.

  • Operador de asterisco de Kotlin antes del nombre de la variable o Operador de extensión en Kotlin
  • Instanciación de una matriz genérica en Kotlin
  • Cómo incrustar los loops en las templates de cadenas de Kotlin
  • cómo comstackr kotlin en el proyecto web eclipse maven
  • ¿Tenemos que aprender java primero para aprender kotlin o puedo comenzarlo directamente?
  • Clase Mock Kotlin en testing de unidad Java
  • ¿Cuál es la forma oficial / correcta de crear la entidad y el file Dao al usar kotlin?
  • La biblioteca de Kotlin 'classes.jar' tiene un formatting no compatible. Actualice la biblioteca o el complemento
  • ¿Cómo anular el método setter en kotlin?
  • Una list de files descargados es nula
  • Obteniendo el error "Tipos incompatibles" cuando se usa el código generado a partir de una class de datos Kotlin