Charla de introducción divertida sobre el lenguaje Kotlin.
Explica las particularidades de este nuevo lenguaje que funciona sobre la máquina virtual Java. Repasa alguna de las principales mejoras, explicando cómo nos ayudan a programar mejor y a ser más felices, incluso a ligar (si pones un poco de tu parte) :-D
2. Betabeers Murcia
30/6/2016
@jdmuriel
¿Cómo ser más feliz?
• Tomar cañas con los amigos
– (Hay estudios: Close relationships, more than
personal satisfaction or one’s view of the
world as a whole, are the most meaningful
factors in happiness. – Magen, Birenbaum,
and Pery 1996)
• Aprender cosas nuevas
3. Betabeers Murcia
30/6/2016
@jdmuriel
Kotlin y yo
• Un poco oxidado como
programador
• Todo empezó con la
Google Code Jam
• Python, Groovy, Java…
• ¿Qué es eso de Kotlin de
lo que hablan tanto?
6. Betabeers Murcia
30/6/2016
@jdmuriel
Aprendiendo Kotlin
• Kotlin es fácil (al menos para los
programadores Java):
fun main (args: Array<String>) {
println("Hello, world")
}
• Java “Pythonizado”, esta vez con tipado
fijo, no como Groovy
7. Betabeers Murcia
30/6/2016
@jdmuriel
Fácil de aprender
• Sintaxis muy similar a Java. Diferencias:
– var, val para definir variables
– Los tipos se marcan detrás
• Interoperabilidad completa con Java
– Tipos equivalentes
– Fácil usar cualquier* librería
– Puede utilizarse desde Java (o Groovy)
• Genera bytecode para Java 6
8. Betabeers Murcia
30/6/2016
@jdmuriel
Extension functions
fun File.miMetodo() {…}
f = File()
f.miMetodo()
• Geniales para acceder a funciones de
librería
• Los principales métodos de java.util,
java.lang.text, etc. están añadidos a las
clases String, Int, File
• Gran parte de las novedades de Kotlin se
implementan así.
11. Betabeers Murcia
30/6/2016
@jdmuriel
Ahorro de tiempo
• El tipo se infiere
• No hay New: var s = Objeto()
• No hay ;
• Getters y setters automáticos
(pueden redefinirse o no)
• Parámetros por defecto y con nombre
objeto.member += objeto.método(param="ddd")
12. Betabeers Murcia
30/6/2016
@jdmuriel
Menos verboso
class EmailMessage2 implements Serializable {
private final String toAddress;
private final String subject;
private final String body;
public EmailMessage2(String toAddress, String
subject, String body) {
this.toAddress = toAddress;
this.subject = subject;
this.body = body;
}
public String getToAddress() {
return toAddress;
}
public String getSubject() {
return subject;
}
public String getBody() {
return body;
}
public boolean equals(Object o) {
return false;
}
public int hashCode() {
return false;
}
}
Data class EmailMessage2 (
val toAddress: String,
val subject: String,
val body: String ): Serializable
13. Betabeers Murcia
30/6/2016
@jdmuriel
Menos verboso (estilo Python)
• Cadenas interpoladas
println (“El resultado es $resultado”)
• Se pueden incluir expresiones
println (“La suma de 3 + 4 es ${3+4}”)
• Funciones definidas con =
Fun hello (name: String) = “Hello $name”
• Asignación por componentes
(a, b) = getCoordinates()
15. Betabeers Murcia
30/6/2016
@jdmuriel
Funciones lambda
• Las funciones son objetos de primer clase
fun suma (a: Int, b: Int) = a + b
var f : (Int, Int) -> Int
f = ::suma
println (f(5,5))
• Si se pasan como último parámetro, se pasan
tras los paréntesis, entre llaves
fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {
for (element in this) action(element)
}
l.forEach { println (it) }
20. Betabeers Murcia
30/6/2016
@jdmuriel
Gestión de nulos
• Tony Hoare introduced Null references in
ALGOL W back in 1965 “simply because it was
so easy to implement”. He talks about that
decision considering it “my billion-dollar
mistake”.
• Las variables que admiten nulos deben tener un
tipo específico (String? en vez de String)
• var a : String = null //Error
• var b : String? = null //OK
• “abc”.contains(b) //Error, requiere String
21. Betabeers Murcia
30/6/2016
@jdmuriel
Gestión de nulos
• Te motiva a utilizar funciones que no devuelven
nulos, excepto en casos especiales (ayuda el
poder devolver dos resultados en un Pair)
• Operador ?. (llama si no nulo)
• Operador ?: (valor por defecto si nulo)
val a = getCell("x")?.substringAfter("-")?:""
22. Betabeers Murcia
30/6/2016
@jdmuriel
Buenas prácticas
• Sintaxis val / var,
inmutableListOf() =>
Favorecen el uso de
variables inmutables,
programación más
funcional
• Interfaces con código,
clases no heredables por
defecto =>
Reducen las jerarquías de
clases heredadas que
complican los diseños
23. Betabeers Murcia
30/6/2016
@jdmuriel
Resumen
• Fácil de aprender
• Interoperable con
Java
• Tipado estático,
inferencia
• Data class
• Cadenas
interpoladas
• Funciones de
extensión de clases
• Gestión de nulos
• Lambdas
• Métodos Java 8 para
colecciones
• Var/val, métodos
para listas, arrays,
sets inmutables
• Interfaces con código
• Clases cerradas