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.