Definición e importación de paquetes

La especificación del paquete debe estar en la parte superior del archivo fuente:

package my.demo

import kotlin.text.*// ...

No es necesario hacer coincidir directorios y paquetes: los archivos de origen se pueden colocar arbitrariamente en el sistema de archivos.

Ver paquetes.

Punto de entrada al programa

Un punto de entrada de una aplicación de Kotlin es el main función.

funmain()println("Hello world!")

Funciones

Función que tiene dos Int parámetros con Int tipo de retorno:

//sampleStartfunsum(a: Int, b: Int): Int return a + b
//sampleEndfunmain()print("sum of 3 and 5 is ")println(sum(3,5))

Función con cuerpo de expresión y tipo de retorno inferido:

//sampleStartfunsum(a: Int, b: Int)= a + b
//sampleEndfunmain()println("sum of 19 and 23 is $sum(19,23)")

Función que no devuelve ningún valor significativo:

//sampleStartfunprintSum(a: Int, b: Int): Unit println("sum of $a and $b is $a + b")//sampleEndfunmain()printSum(-1,8)

Unit el tipo de retorno se puede omitir:

//sampleStartfunprintSum(a: Int, b: Int)println("sum of $a and $b is $a + b")//sampleEndfunmain()printSum(-1,8)

Ver funciones.

Variables

Las variables locales de solo lectura se definen mediante la palabra clave val. Solo se les puede asignar un valor una vez.

funmain()//sampleStartval a: Int =1// immediate assignmentval b =2// `Int` type is inferredval c: Int  // Type required when no initializer is provided
    c =3// deferred assignment//sampleEndprintln("a = $a, b = $b, c = $c")

Las variables que se pueden reasignar utilizan el var palabra clave:

funmain()//sampleStartvar x =5// `Int` type is inferred
    x +=1//sampleEndprintln("x = $x")

Variables de nivel superior:

//sampleStartval PI =3.14var x =0funincrementX() 
    x +=1//sampleEndfunmain()println("x = $x; PI = $PI")incrementX()println("incrementX()")println("x = $x; PI = $PI")

Consulte también Propiedades y campos.

Comentarios

Al igual que la mayoría de los lenguajes modernos, Kotlin admite una sola línea (o fin de la línea) y multilínea (cuadra) comentarios.

// This is an end-of-line comment/* This is a block comment
   on multiple lines. */

Los comentarios de bloque en Kotlin se pueden anidar.

/* The comment starts here
/* contains a nested comment */and ends here.*/

Consulte Documentar el código Kotlin para obtener información sobre la sintaxis de los comentarios de la documentación.

Plantillas de cadenas

funmain()//sampleStartvar a =1// simple name in template:val s1 ="a is $a" 
    
    a =2// arbitrary expression in template:val s2 ="$s1.replace("is", "was"), but now is $a"//sampleEndprintln(s2)

Consulte Plantillas de cadenas para obtener más detalles.

Expresiones condicionales

//sampleStartfunmaxOf(a: Int, b: Int): Int if(a > b)return a
    elsereturn b
    //sampleEndfunmain()println("max of 0 and 42 is $maxOf(0,42)")

En Kotlin, si también se puede utilizar como expresión:

//sampleStartfunmaxOf(a: Int, b: Int)=if(a > b) a else b
//sampleEndfunmain()println("max of 0 and 42 is $maxOf(0,42)")

Ver si-expresiones.

Valores que aceptan valores NULL y nulo cheques

Una referencia debe marcarse explícitamente como anulable cuando nulo el valor es posible.

Regreso nulo si str no contiene un número entero:

funparseInt(str: String): Int?// ...

Utilice una función que devuelva un valor anulable:

funparseInt(str: String): Int?return str.toIntOrNull()//sampleStartfunprintProduct(arg1: String, arg2: String)val x =parseInt(arg1)val y =parseInt(arg2)// Using `x * y` yields error because they may hold nulls.if(x !=null&& y !=null)// x and y are automatically cast to non-nullable after null checkprintln(x * y)elseprintln("'$arg1' or '$arg2' is not a number")//sampleEndfunmain()printProduct("6","7")printProduct("a","7")printProduct("a","b")

o

funparseInt(str: String): Int?return str.toIntOrNull()funprintProduct(arg1: String, arg2: String)val x =parseInt(arg1)val y =parseInt(arg2)//sampleStart// ...if(x ==null)println("Wrong number format in arg1: '$arg1'")returnif(y ==null)println("Wrong number format in arg2: '$arg2'")return// x and y are automatically cast to non-nullable after null checkprintln(x * y)//sampleEndfunmain()printProduct("6","7")printProduct("a","7")printProduct("99","b")

Consulte Seguridad nula.

Comprobaciones de tipo y lanzamientos automáticos

los es El operador comprueba si una expresión es una instancia de un tipo. Si se comprueba una propiedad o variable local inmutable para un tipo específico, no es necesario convertirla explícitamente:

//sampleStartfungetStringLength(obj: Any): Int?if(obj is String)// `obj` is automatically cast to `String` in this branchreturn obj.length
    // `obj` is still of type `Any` outside of the type-checked branchreturnnull//sampleEndfunmain()funprintLength(obj: Any)println("'$obj' string length is $getStringLength(obj) ?: "... err, not a string" ")printLength("Incomprehensibilities")printLength(1000)printLength(listOf(Any()))

o

//sampleStartfungetStringLength(obj: Any): Int?if(obj !is String)returnnull// `obj` is automatically cast to `String` in this branchreturn obj.length
//sampleEndfunmain()funprintLength(obj: Any)println("'$obj' string length is $getStringLength(obj) ?: "... err, not a string" ")printLength("Incomprehensibilities")printLength(1000)printLength(listOf(Any()))

o incluso

//sampleStartfungetStringLength(obj: Any): Int?// `obj` is automatically cast to `String` on the right-hand side of `&&`if(obj is String && obj.length >0)return obj.length
    returnnull//sampleEndfunmain()funprintLength(obj: Any)println("'$obj' string length is $getStringLength(obj) ?: "... err,is empty or not a string at all" ")printLength("Incomprehensibilities")printLength("")printLength(1000)

Consulte Conversiones de clases y tipos.

for círculo

funmain()//sampleStartval items =listOf("apple","banana","kiwifruit")for(item in items)println(item)//sampleEnd

o

funmain()//sampleStartval items =listOf("apple","banana","kiwifruit")for(index in items.indices)println("item at $index is $items[index]")//sampleEnd

Consulte el bucle.

while círculo

funmain()//sampleStartval items =listOf("apple","banana","kiwifruit")var index =0while(index < items.size)println("item at $index is $items[index]")
        index++//sampleEnd

Ver bucle while.

when expresión

//sampleStartfundescribe(obj: Any): String =when(obj)1->"One""Hello"->"Greeting"is Long    ->"Long"!is String ->"Not a string"else->"Unknown"//sampleEndfunmain()println(describe(1))println(describe("Hello"))println(describe(1000L))println(describe(2))println(describe("other"))

Ver cuando expresión.

Rangos

Verifique si un número está dentro de un rango usando en operador:

funmain()//sampleStartval x =10val y =9if(x in1..y+1)println("fits in range")//sampleEnd

Compruebe si un número está fuera de rango:

funmain()//sampleStartval list =listOf("a","b","c")if(-1!in0..list.lastIndex)println("-1 is out of range")if(list.size !in list.indices)println("list size is out of valid list indices range, too")//sampleEnd

Iterando sobre un rango:

funmain()//sampleStartfor(x in1..5)print(x)//sampleEnd

o sobre una progresión:

funmain()//sampleStartfor(x in1..10 step 2)print(x)println()for(x in9 downTo 0 step 3)print(x)//sampleEnd

Ver rangos.

Colecciones

Iterando sobre una colección:

funmain()val items =listOf("apple","banana","kiwifruit")//sampleStartfor(item in items)println(item)//sampleEnd

Comprobando si una colección contiene un objeto usando en operador:

funmain()val items =setOf("apple","banana","kiwifruit")//sampleStartwhen"orange"in items ->println("juicy")"apple"in items ->println("apple is fine too")//sampleEnd

Usando expresiones lambda para filtrar y mapear colecciones:

funmain()//sampleStartval fruits =listOf("banana","avocado","apple","kiwifruit")
    fruits
      .filter it.startsWith("a").sortedBy it .map it.toUpperCase().forEachprintln(it)//sampleEnd

Consulte Descripción general de las colecciones.

Creando clases básicas y sus instancias

funmain()//sampleStartval rectangle =Rectangle(5.0,2.0)val triangle =Triangle(3.0,4.0,5.0)//sampleEndprintln("Area of rectangle is $rectangle.calculateArea(), its perimeter is $rectangle.perimeter")println("Area of triangle is $triangle.calculateArea(), its perimeter is $triangle.perimeter")abstractclassShape(val sides: List<Double>)val perimeter: Double get()= sides.sum()abstractfuncalculateArea(): Double
interface RectangleProperties val isSquare: Boolean
classRectangle(var height: Double,var length: Double
):Shape(listOf(height, length, height, length)), RectangleProperties overrideval isSquare: Boolean get()= length == height
    overridefuncalculateArea(): Double = height * length
classTriangle(var sideA: Double,var sideB: Double,var sideC: Double
):Shape(listOf(sideA, sideB, sideC))overridefuncalculateArea(): Double val s = perimeter /2return Math.sqrt(s *(s - sideA)*(s - sideB)*(s - sideC))

Ver clases, objetos e instancias.