Kotlin
Kotlin
Kotlin
Kotlin - Inicio
Kotlin - Descripción general
Kotlin - Configuración del entorno
Kotlin - Arquitectura
Kotlin - Tipos básicos
Kotlin - Control de flujo
Kotlin - Clase y objeto
Kotlin - Constructores
Kotlin - Herencia
Kotlin - Interfaz
Kotlin - Control de visibilidad
Kotlin - Extensión
Kotlin - Clases de datos
Kotlin - Clase sellada
Kotlin - Genéricos
Kotlin - Delegación
Kotlin - Funciones
Kotlin - Declaraciones de desestructuración
Kotlin - Manejo de excepciones
Kotlin - Descripción general
Kotlin es un nuevo lenguaje de programación de código abierto como Java,
JavaScript, etc. Es un lenguaje de alto nivel fuertemente tipado estáticamente
que combina partes funcionales y técnicas en un mismo lugar. Actualmente,
Kotlin apunta a Java y JavaScript. Se ejecuta en JVM.
Kotlin está influenciado por otros lenguajes de programación como Java,
Scala, Groovy, Gosu, etc. La sintaxis de Kotlin puede no ser exactamente
similar a JAVA, sin embargo, internamente Kotlin depende de la biblioteca
Java Class existente para producir resultados maravillosos para los
programadores. . Kotlin proporciona interoperabilidad, seguridad de código y
claridad a los desarrolladores de todo el mundo.
Ventajas y desventajas
Las siguientes son algunas de las ventajas de usar Kotlin para el desarrollo de
su aplicación.
Lenguaje fácil : Kotlin es un lenguaje funcional y muy fácil de aprender. La
sintaxis es bastante similar a Java, por lo tanto, es muy fácil de recordar. Kotlin
es más expresivo, lo que hace que su código sea más legible y comprensible.
Conciso : Kotlin se basa en JVM y es un lenguaje funcional. Por lo tanto,
reduce muchos códigos de placa de caldera utilizados en otros lenguajes de
programación.
Tiempo de ejecución y rendimiento : mejor rendimiento y menor tiempo de
ejecución.
Interoperabilidad : Kotlin es lo suficientemente maduro como para construir
una aplicación interoperable de una manera menos compleja.
Nuevo : Kotlin es un nuevo lenguaje que brinda a los desarrolladores un
nuevo comienzo. No es un reemplazo de Java, aunque está desarrollado
sobre JVM. Se acepta como el primer idioma oficial del desarrollo de
Android. Kotlin se puede definir como - Kotlin = JAVA + nuevas características
adicionales actualizadas.
Las siguientes son algunas de las desventajas de Kotlin.
Declaración de espacio de nombres : Kotlin permite a los desarrolladores
declarar las funciones en el nivel superior. Sin embargo, cada vez que se
declara la misma función en muchos lugares de su aplicación, es difícil
entender qué función se llama.
Sin declaración estática : Kotlin no tiene un modificador de manejo estático
habitual como Java, lo que puede causar algún problema al desarrollador Java
convencional.
NetBeans https://netbeans.org/downloads/
Eclipse https://www.eclipse.org/downloads/
Números
La representación de números en Kotlin es bastante similar a Java, sin
embargo, Kotlin no permite la conversión interna de diferentes tipos de
datos. La siguiente tabla enumera diferentes longitudes variables para
diferentes números.
Type Size
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
Booleano
Boolean es muy simple como otros lenguajes de programación. Solo tenemos
dos valores para Boolean: verdadero o falso. En el siguiente ejemplo, veremos
cómo Kotlin interpreta el booleano.
Demo en vivo
fun main(args: Array<String>) {
val letter: Boolean // defining a variable
letter = true // Assinging a value to it
println("Your character value is "+"$letter")
}
Instrumentos de cuerda
Las cadenas son matrices de caracteres. Al igual que Java, son inmutables
por naturaleza. Tenemos dos tipos de cadenas disponibles en Kotlin: una se
llama cadena sin procesar y otra se llama cadena escapada . En el
siguiente ejemplo, haremos uso de estas cadenas.
Demo en vivo
fun main(args: Array<String>) {
var rawString :String = "I am Raw String!"
val escapedString : String = "I am escaped String!\n"
println("Hello!"+escapedString)
println("Hey!!"+rawString)
}
El ejemplo anterior de String escapado permite proporcionar espacio de línea
adicional después de la primera instrucción de impresión. A continuación se
mostrará el resultado en el navegador.
Hello!I am escaped String!
Matrices
Las matrices son una colección de datos homogéneos. Al igual que Java,
Kotlin admite matrices de diferentes tipos de datos. En el siguiente ejemplo,
haremos uso de diferentes matrices.
Demo en vivo
fun main(args: Array<String>) {
val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
println("Hey!! I am array Example"+numbers[2])
}
Colecciones
La recopilación es una parte muy importante de la estructura de datos, lo que
facilita el desarrollo de software para los ingenieros. Kotlin tiene dos tipos de
colección: una es una colección inmutable (que significa listas, mapas y
conjuntos que no pueden ser editables) y otra es una colección
mutable (este tipo de colección es editable). Es muy importante tener en
cuenta el tipo de colección utilizada en su aplicación, ya que el sistema Kotlin
no representa ninguna diferencia específica en ellas.
Demo en vivo
fun main(args: Array<String>) {
val numbers: MutableList<Int> = mutableListOf(1, 2, 3)
//mutable List
val readOnlyView: List<Int> = numbers //
immutable list
println("my mutable list--"+numbers) // prints "[1,
2, 3]"
numbers.add(4)
println("my mutable list after addition --"+numbers)
// prints "[1, 2, 3, 4]"
println(readOnlyView)
readOnlyView.clear() // ⇒ does not compile
// gives error
}
El código anterior generará el siguiente resultado en el navegador. Da un error
cuando intentamos borrar la lista mutable de colección.
main.kt:9:18: error: unresolved reference: clear
readOnlyView.clear() // -> does not compile
^
En la colección, Kotlin proporciona algunos métodos útiles como first (), last
(), filter () , etc. Todos estos métodos son autodescriptivos y fáciles de
implementar. Además, Kotlin sigue la misma estructura, como Java, mientras
implementa la recopilación. Usted es libre de implementar cualquier colección
de su elección, como Mapa y Conjunto.
En el siguiente ejemplo, hemos implementado Map and Set utilizando
diferentes métodos integrados.
Demo en vivo
fun main(args: Array<String>) {
val items = listOf(1, 2, 3, 4)
println("First Element of our list----"+items.first())
println("Last Element of our list----"+items.last())
println("Even Numbers of our List----"+items.
filter { it % 2 = = 0 }) // returns [2, 4]
Rangos
Los rangos son otra característica única de Kotlin. Al igual que Haskell,
proporciona un operador que lo ayuda a recorrer un rango. Internamente, se
implementa utilizando rangeTo () y su forma de operador es (..) .
En el siguiente ejemplo, veremos cómo Kotlin interpreta este operador de
rango.
Demo en vivo
fun main(args: Array<String>) {
val i:Int = 2
for (j in 1..4)
print(j) // prints "1234"
if (i in 1..10) { // equivalent of 1 < = i && i < = 10
println("we found your number --"+i)
}
}
El fragmento de código anterior produce el siguiente resultado en el
navegador.
1234we found your number --2
Kotlin - Control de flujo
En el capítulo anterior hemos aprendido sobre los diferentes tipos de tipos de
datos disponibles en el sistema Kotlin. En este capítulo, discutiremos los
diferentes tipos de mecanismos de control de flujo disponibles en Kotlin.
Si - de lo contrario
Kotlin es un lenguaje funcional, por lo tanto, como todo lenguaje funcional en
Kotlin, "si" es una expresión, no es una palabra clave. La
expresión "si" devolverá un valor siempre que sea necesario. Al igual que
otros lenguajes de programación, el bloque "if-else" se utiliza como operador
de verificación condicional inicial. En el siguiente ejemplo, compararemos dos
variables y proporcionaremos la salida requerida en consecuencia.
Demo en vivo
fun main(args: Array<String>) {
val a:Int = 5
val b:Int = 2
var max: Int
if (a > b) {
max = a
} else {
max = b
}
print("Maximum of a or b is " +max)
// As expression
// val max = if (a > b) a else b
}
Uso de cuando
Si está familiarizado con otros lenguajes de programación, es posible que
haya oído hablar del término declaración de cambio, que es básicamente un
operador condicional cuando se pueden aplicar múltiples condiciones en una
variable en particular. El operador "cuándo" compara el valor de la variable
con las condiciones de la rama. Si cumple la condición de bifurcación,
ejecutará la declaración dentro de ese alcance. En el siguiente ejemplo,
aprenderemos más sobre "cuándo" en Kotlin.
Demo en vivo
fun main(args: Array<String>) {
val x:Int = 5
when (x) {
1 -> print("x = = 1")
2 -> print("x = = 2")
En bucle
Loop es una invención que proporciona la flexibilidad para iterar a través de
cualquier tipo de estructura de datos. Al igual que otros lenguajes de
programación, Kotlin también proporciona muchos tipos de metodología de
bucle, sin embargo, entre ellos, "For" es el más exitoso. La implementación y
el uso de For loop es conceptualmente similar a Java for loop. El siguiente
ejemplo muestra cómo podemos usar lo mismo en ejemplos de la vida real.
Demo en vivo
fun main(args: Array<String>) {
val items = listOf(1, 2, 3, 4)
for (i in items) println("values of the array"+i)
}
while(x< = 10) {
println(x)
x++
}
}
El fragmento de código anterior produce el siguiente resultado en el
navegador.
Example of While Loop--
0
1
2
3
4
5
6
7
8
9
10
Kotlin también tiene otro ciclo llamado ciclo Do-While, donde el cuerpo del
ciclo se ejecutará una vez, solo entonces se comprobará la condición. El
siguiente ejemplo muestra el uso del bucle Do-while .
Demo en vivo
fun main(args: Array<String>) {
var x:Int = 0
do {
x = x + 10
println("I am inside Do block---"+x)
} while(x <= 50)
}
El fragmento de código anterior produce el siguiente resultado en el
navegador. En el código anterior, el compilador de Kotlin ejecutará el bloque
DO, luego irá a verificar la condición mientras se bloquea.
I am inside Do block---10
I am inside Do block---20
I am inside Do block---30
I am inside Do block---40
I am inside Do block---50
I am inside Do block---60
// class Body
}
Al igual que Java, Kotlin también permite crear varios objetos de una clase y
usted es libre de incluir sus miembros y funciones de clase. Podemos controlar
la visibilidad de las variables de los miembros de la clase usando diferentes
palabras clave que aprenderemos en el Capítulo 10 - Control de visibilidad. En
el siguiente ejemplo, crearemos una clase y su objeto a través del cual
accederemos a diferentes miembros de datos de esa clase.
Demo en vivo
class myClass {
// property (data member)
private var name: String = "Tutorials.point"
// member function
fun printMe() {
print("You are at the best Learning website Named-
"+name)
}
}
fun main(args: Array<String>) {
val obj = myClass() // create obj object of myClass class
obj.printMe()
}
El código anterior generará el siguiente resultado en el navegador, donde
llamaremos a printMe () de myClass usando su propio objeto.
You are at the best Learning website Named- Tutorials.point
Clase anidada
Por definición, cuando una clase se ha creado dentro de otra clase, se llama
como una clase anidada. En Kotlin, la clase anidada es estática por defecto,
por lo tanto, se puede acceder sin crear ningún objeto de esa clase. En el
siguiente ejemplo, veremos cómo Kotlin interpreta nuestra clase anidada.
Demo en vivo
fun main(args: Array<String>) {
val demo = Outer.Nested().foo() // calling nested class
method
print(demo)
}
class Outer {
class Nested {
fun foo() = "Welcome to The Postparaprogramadores.com"
}
}
El código anterior generará el siguiente resultado en el navegador.
Welcome to The Postparaprogramadores.com
Clase interior
Cuando una clase anidada se marca como "interna", se llamará como una
clase interna. El miembro de datos de la clase externa puede acceder a una
clase interna. En el siguiente ejemplo, accederemos al miembro de datos de la
clase externa.
Demo en vivo
fun main(args: Array<String>) {
val demo = Outer().Nested().foo() // calling nested class
method
print(demo)
}
class Outer {
private val welcomeMessage: String = "Welcome to the
Postparaprogramadores.com"
inner class Nested {
fun foo() = welcomeMessage
}
}
Alias de tipo
Los alias de tipo son propiedad del compilador Kotlin. Proporciona la
flexibilidad de crear un nuevo nombre de un tipo existente, no crea un nuevo
tipo. Si el nombre del tipo es demasiado largo, puede introducir fácilmente un
nombre más corto y usarlo para uso futuro. Los alias de tipo son realmente
útiles para el tipo complejo. En la última versión, Kotlin revocó la
compatibilidad con los alias de tipo, sin embargo, si está utilizando una versión
anterior de Kotlin, puede haberla utilizado de la siguiente manera:
typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>
Kotlin - Constructores
En este capítulo, aprenderemos sobre los constructores en Kotlin. Kotlin tiene
dos tipos de constructor: uno es el constructor primario y el otro es
el constructor secundario . Una clase de Kotlin puede tener un constructor
primario y uno o más constructores secundarios. El constructor Java inicializa
las variables miembro, sin embargo, en Kotlin el constructor primario inicializa
la clase, mientras que el constructor secundario ayuda a incluir algo de lógica
adicional mientras se inicializa la misma. El constructor primario se puede
declarar a nivel de encabezado de clase como se muestra en el siguiente
ejemplo.
class Person(val firstName: String, var age: Int) {
// class body
}
fun hello() {
println("Hello there, Welcome to
Postparaprogramadores.Com!")
}
}
class InterfaceImp : ExampleInterface {
override var myVar: Int = 25
override fun absMethod() = "Happy Learning "
}
fun main(args: Array<String>) {
val obj = InterfaceImp()
println("My Variable Value is = ${obj.myVar}")
print("Calling hello(): ")
obj.hello()
Privado
Las clases, métodos y paquetes se pueden declarar con un modificador
privado. Una vez que algo se declara como privado, será accesible dentro de
su alcance inmediato. Por ejemplo, se puede acceder a un paquete privado
dentro de ese archivo específico. Una clase o interfaz privada solo puede ser
accesible por sus miembros de datos, etc.
private class privateExample {
private val i = 1
private val doSomething() {
}
}
En el ejemplo anterior, la clase "privateExample" y la variable i solo pueden
ser accesibles en el mismo archivo Kotlin, donde se menciona ya que todas se
declaran como privadas en el bloque de declaración.
Protegido
Protegido es otro modificador de acceso para Kotlin, que actualmente no está
disponible para la declaración de nivel superior, ya que ningún paquete puede
protegerse. Una clase o interfaz protegida es visible solo para su subclase.
class A() {
protected val i = 1
}
class B : A() {
fun getValue() : Int {
return i
}
}
En el ejemplo anterior, la variable "i" se declara protegida, por lo tanto, solo es
visible para su subclase.
Interno
Internal es un modificador recientemente agregado introducido en Kotlin. Si
algo está marcado como interno, entonces ese campo específico estará en el
campo interno. Un paquete interno es visible solo dentro del módulo bajo el
cual se implementa. Una interfaz de clase interna solo es visible por otra clase
presente dentro del mismo paquete o módulo. En el siguiente ejemplo,
veremos cómo implementar un método interno.
class internalExample {
internal val i = 1
internal fun doSomething() {
}
}
En el ejemplo anterior, el método llamado "doSomething" y la variable se
menciona como interna, por lo tanto, estos dos campos solo pueden ser
accesibles dentro del paquete bajo el cual se declara.
Público
Se puede acceder al modificador público desde cualquier parte del espacio de
trabajo del proyecto. Si no se especifica ningún modificador de acceso, de
forma predeterminada estará en el ámbito público. En todos nuestros ejemplos
anteriores, no hemos mencionado ningún modificador, por lo tanto, todos
están en el ámbito público. El siguiente es un ejemplo para comprender más
sobre cómo declarar una variable o método público.
class publicExample {
val i = 1
fun doSomething() {
}
}
Kotlin - Extensión
En este capítulo, aprenderemos sobre otra nueva característica de Kotlin
llamada "Extensión". Usando la extensión, podremos agregar o eliminar
algunas funciones del método incluso sin heredarlas o modificarlas. Las
extensiones se resuelven estadísticamente. En realidad, no modifica la clase
existente, pero crea una función invocable que se puede llamar con una
operación de punto.
Extensión de la función
En la extensión de la función, Kotlin permite definir un método fuera de la
clase principal. En el siguiente ejemplo, veremos cómo se implementa la
extensión a nivel funcional.
Demo en vivo
class Alien {
var skills : String = "null"
fun printMySkills() {
print(skills)
}
}
fun main(args: Array<String>) {
var a1 = Alien()
a1.skills = "JAVA"
//a1.printMySkills()
var a2 = Alien()
a2.skills = "SQL"
//a2.printMySkills()
var a3 = Alien()
a3.skills = a1.addMySkills(a2)
a3.printMySkills()
}
fun Alien.addMySkills(a:Alien):String{
var a4 = Alien()
a4.skills = this.skills + " " +a.skills
return a4.skills
}
En el ejemplo anterior, no tenemos ningún método dentro de la clase "Alien"
llamada "addMySkills ()", sin embargo, todavía estamos implementando el
mismo método en otro lugar fuera de la clase. Esta es la magia de la
extensión.
El código anterior generará el siguiente resultado en el navegador.
JAVA SQL
Extensión de objeto
Kotlin proporciona otro mecanismo para implementar la funcionalidad estática
de Java. Esto se puede lograr usando la palabra clave "objeto
complementario". Usando este mecanismo, podemos crear un objeto de una
clase dentro de un método de fábrica y luego podemos llamar a ese método
usando la referencia del nombre de la clase. En el siguiente ejemplo,
crearemos un "objeto complementario".
Demo en vivo
fun main(args: Array<String>) {
println("Heyyy!!!"+A.show())
}
class A {
companion object {
fun show():String {
return("You are learning Kotlin from
Postparaprogramadores.com")
}
}
}
println(output)
}
En el ejemplo anterior, tenemos una clase sellada llamada "MyExample", que
puede ser de dos tipos solamente: uno es "OP1" y otro es "OP2". En la clase
principal, estamos creando un objeto en nuestra clase y asignando su tipo en
tiempo de ejecución. Ahora, como esta clase "MyExample" está sellada,
podemos aplicar la cláusula "when" en tiempo de ejecución para implementar
la salida final.
En la clase sellada, no necesitamos usar ninguna declaración innecesaria
"else" para completar el código. El código anterior generará el siguiente
resultado en el navegador.
option Two has been chosen
Kotlin - Genéricos
Al igual que Java, Kotlin proporciona un orden superior de escritura variable
denominado Genéricos. En este capítulo, aprenderemos cómo Kotlin
implementa Generics y cómo, como desarrollador, podemos usar esas
funcionalidades proporcionadas dentro de la biblioteca de genéricos. En
cuanto a la implementación, los genéricos son bastante similares a Java, pero
el desarrollador de Kotlin ha introducido dos nuevas palabras
clave "fuera" y "dentro" para que los códigos de Kotlin sean más legibles y
fáciles para el desarrollador.
En Kotlin, una clase y un tipo son conceptos totalmente diferentes. Según el
ejemplo, List es una clase en Kotlin, mientras que List <String> es un tipo en
Kotlin. El siguiente ejemplo muestra cómo se implementan los genéricos en
Kotlin.
fun main(args: Array<String>) {
val integer: Int = 1
val number: Number = integer
print(number)
}
Delegación de propiedad
En la sección anterior, hemos aprendido sobre el patrón de diseño de
delegación usando la palabra clave "by". En esta sección, aprenderemos
sobre la delegación de propiedades utilizando algunos métodos estándar
mencionados en la biblioteca de Kotlin.
Delegar significa pasar la responsabilidad a otra clase o método. Cuando una
propiedad ya está declarada en algunos lugares, deberíamos reutilizar el
mismo código para inicializarla. En los siguientes ejemplos, utilizaremos
alguna metodología de delegación estándar proporcionada por Kotlin y alguna
función de biblioteca estándar mientras implementamos la delegación en
nuestros ejemplos.
Usando Lazy ()
Lazy es una función lambda que toma una propiedad como entrada y, a
cambio, proporciona una instancia de Lazy <T> , donde <T> es básicamente
el tipo de propiedades que está utilizando. Echemos un vistazo a lo siguiente
para comprender cómo funciona.
Demo en vivo
val myVar: String by lazy {
"Hello"
}
fun main(args: Array<String>) {
println(myVar +" My dear friend")
}
En el fragmento de código anterior, estamos pasando una variable "myVar" a
la función Lazy, que a cambio asigna el valor a su objeto y lo devuelve a la
función principal. A continuación se muestra la salida en el navegador.
Hello My dear friend
Delegetion.Observable ()
Kotlin - Funciones
Kotlin es un lenguaje de tipo estático, por lo tanto, las funciones juegan un
gran papel en él. Estamos bastante familiarizados con la función, ya que
estamos usando la función en todos los ejemplos. La función se declara con la
palabra clave "diversión". Al igual que cualquier otra OOP, también necesita
un tipo de retorno y una lista de argumentos de opción.
En el siguiente ejemplo, estamos definiendo una función llamada MyFunction y
desde la función principal estamos llamando a esta función y pasando algún
argumento.
Demo en vivo
fun main(args: Array<String>) {
println(MyFunction("postparaprogramadores.com"))
}
fun MyFunction(x: String): String {
var c:String = "Hey!! Welcome To ---"
return (c+x)
}
Función lambda
Lambda es una función de alto nivel que reduce drásticamente el código de la
placa de la caldera al declarar una función y definirla. Kotlin te permite definir
tu propia lambda. En Kotlin, puede declarar su lambda y pasar esa lambda a
una función.
Eche un vistazo al siguiente ejemplo.
Demo en vivo
fun main(args: Array<String>) {
val mylambda :(String)->Unit = {s:String->print(s)}
val v:String = "Postparaprogramadores.com"
mylambda(v)
}
En el código anterior, hemos creado nuestra propia lambda conocida como
"mylambda" y hemos pasado una variable a esta lambda, que es de tipo String
y contiene un valor "Postparaprogramadores.com".
El código anterior generará el siguiente resultado en el navegador.
Postparaprogramadores.com
Función en línea
El ejemplo anterior muestra lo básico de la expresión lambda que podemos
usar en la aplicación Kotlin. Ahora, podemos pasar un lambda a otra función
para obtener nuestra salida, lo que hace que la función de llamada sea una
función en línea.
Eche un vistazo al siguiente ejemplo.
Demo en vivo
fun main(args: Array<String>) {
val mylambda:(String)->Unit = {s:String->print(s)}
val v:String = "Postparaprogramadores.com"
myFun(v,mylambda) //passing lambda as a parameter of
another function
}
fun myFun(a :String, action: (String)->Unit) { //passing
lambda
print("Heyyy!!!")
action(a)// call to lambda function
}