From 99394937d378e661e9314773501db9ebe364fd3a Mon Sep 17 00:00:00 2001
From: Aitor Escolar <aitorescolarcabeza@gmail.com>
Date: Thu, 20 Jun 2019 14:21:05 +0200
Subject: update kotlin-es with some additional information and improved
 example

---
 es-es/kotlin-es.html.markdown | 67 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 53 insertions(+), 14 deletions(-)

(limited to 'es-es/kotlin-es.html.markdown')

diff --git a/es-es/kotlin-es.html.markdown b/es-es/kotlin-es.html.markdown
index 045f92d1..132e6241 100644
--- a/es-es/kotlin-es.html.markdown
+++ b/es-es/kotlin-es.html.markdown
@@ -40,6 +40,12 @@ fun main(args: Array<String>) {
     Podemos declarar explícitamente el tipo de una variable así:
     */
     val foo: Int = 7
+    
+    /* 
+    A diferencia de JavaScript, aunque el tipo se infiera, es tipado, por lo que no se puede cambiar el tipo a posteriori
+    */
+    var fooInt = 14 // Se infiere tipo Int
+    fooInt = "Cadena" // ERROR en tiempo de compilación: Type mismatch
 
     /*
     Las cadenas pueden ser representadas de la misma manera que Java.
@@ -84,7 +90,6 @@ fun main(args: Array<String>) {
     println(fooNullable?.length) // => null
     println(fooNullable?.length ?: -1) // => -1
 
-
     /*
     Las funciones pueden ser declaras usando la palabra clave "fun".
     Los argumentos de las funciones son especificados entre corchetes despues del nombre de la función.
@@ -122,6 +127,40 @@ fun main(args: Array<String>) {
     fun even(x: Int) = x % 2 == 0
     println(even(6)) // => true
     println(even(7)) // => false
+    
+    /* 
+    Kotlin permite el uso de lambdas, o funciones anónimas
+    */
+    
+    // Sin lambda:
+    interface MyListener {
+        fun onClick(foo: Foo)
+    }
+
+    fun listenSomething(listener: MyListener) {
+        listener.onClick(Foo())
+    }
+    
+    listenSomething(object: MyListener {
+        override fun onClick(foo: Foo) {
+            //...
+        }
+    })
+    
+    // Con lambda:
+    fun listenSomethingLambda(listener: (Foo) -> Unit) {
+        listener(Foo())
+    }
+    
+    listenSomethingLambda {
+        //Se recibe foo
+    }
+    
+    // el operador typealias permite, entre otras cosas, simplificar las expresiones con lambdas
+    typealias MyLambdaListener = (Foo) -> Unit
+    fun listenSomethingLambda(listener: MyLambdaListener) {
+        listener(Foo())
+    }
 
     // Las funciones pueden tomar funciones como argumentos y 
     // retornar funciones.
@@ -219,6 +258,11 @@ fun main(args: Array<String>) {
     val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9)
     // Se puede acceder a los valores del mapa por su llave.
     println(fooMap["a"]) // => 8
+    
+    // Tanto Map como cualquier colección iterable, tienen la función de extensión forEach
+    fooMap.forEach {
+        println("${it.key} ${it.value}")
+    }
 
     /*
     Las secuencias representan colecciones evaluadas diferidamente.
@@ -245,7 +289,7 @@ fun main(args: Array<String>) {
     val y = fibonacciSequence().take(10).toList()
     println(y) // => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
 
-    // Kotlin provee funciones de Orden-Mayor para trabajar con colecciones.
+    // Kotlin provee funciones de orden superior para trabajar con colecciones.
     val z = (1..9).map {it * 3}
             .filter {it < 20}
             .groupBy {it % 2 == 0}
@@ -305,17 +349,11 @@ fun main(args: Array<String>) {
     ese tipo sin convertido de forma explícita.
      */
     fun smartCastExample(x: Any) : Boolean {
-        if (x is Boolean) {
-            // x es automaticamente convertido a Boolean
-            return x
-        } else if (x is Int) {
-            // x es automaticamente convertido a Int
-            return x > 0
-        } else if (x is String) {
-            // x  es automaticamente convertido a String
-            return x.isNotEmpty()
-        } else {
-            return false
+        return when (x) {
+            is Boolean -> x // x es automaticamente convertido a Boolean
+            is Int -> x > 0 // x es automaticamente convertido a Int
+            is String -> x.isNotEmpty() // x  es automaticamente convertido a String
+            else -> false
         }
     }
     println(smartCastExample("Hola, mundo!")) // => true
@@ -345,7 +383,8 @@ enum class EnumExample {
 /*
 La palabra clave "object" se puede utilizar para crear objetos únicos.
 No podemos asignarlo a una variable, pero podemos hacer referencia a ella por su nombre.
-Esto es similar a los objetos únicos de Scala
+Esto es similar a los objetos únicos de Scala.
+En la mayoría de ocasiones, los objetos únicos se usan como alternativa a los Singleton.
 */
 object ObjectExample {
     fun hello() : String {
-- 
cgit v1.2.3


From e9ad74e0a0e6dd0ed9e64fc44dc8c6f58dbb6de1 Mon Sep 17 00:00:00 2001
From: Aitor Escolar <aitorescolarcabeza@gmail.com>
Date: Fri, 21 Jun 2019 09:18:58 +0200
Subject: Update kotlin-es.html.markdown

---
 es-es/kotlin-es.html.markdown | 1 +
 1 file changed, 1 insertion(+)

(limited to 'es-es/kotlin-es.html.markdown')

diff --git a/es-es/kotlin-es.html.markdown b/es-es/kotlin-es.html.markdown
index 132e6241..80d7a4bb 100644
--- a/es-es/kotlin-es.html.markdown
+++ b/es-es/kotlin-es.html.markdown
@@ -2,6 +2,7 @@
 language: kotlin
 contributors:
 - ["S Webber", "https://github.com/s-webber"]
+- ["Aitor Escolar", "https://github.com/aiescola"]
 translators:
 - ["Ivan Alburquerque", "https://github.com/AlburIvan"]
 lang: es-es
-- 
cgit v1.2.3