SlideShare ist ein Scribd-Unternehmen logo
1 von 55
Downloaden Sie, um offline zu lesen
Introducción a Kotlin para desarrolladores Java
Víctor Orozco
6 de mayo de 2020
@tuxtor
1
Contexto
Caracteristicas interesantes
Demo productiva
Kotlin vs. Java
2
Contexto
¿Java?
• Lenguaje (Java 11)
• OpenJDK (Java Virtual Machine)
• Bibliotecas/API (Java Classpath)
El conjunto de los 3 es la plataforma Java(TM) pero pueden usarse de forma
independiente
3
Java en Android
• Lenguaje (Java 7)
• ART/Dalvik
• Bibliotecas/API (Java+Google
Classpath)
4
Java - Java como JVM
5
JVM
6
Kotlin
• Lenguaje (Kotlin)
• OpenJDK (Java Virtual Machine)
• Bibliotecas/API (Java Classpath)
• kotlin-stdlib
7
Kotlin en Android
• Lenguaje (Kotlin)
• ART/Dalvik
• Bibliotecas/API (Java+Google
Classpath)
• kotlin-stdlib
8
Kotlin en JS
• Lenguaje (Kotlin)
• V8/SpiderMonkey
• Bibliotecas/API (ECMA 6 + Web)
• kotlin-stdlib
9
Kotlin Nativo
• Lenguaje (Kotlin)
• LLVM
• GLibc (Linux)
• kotlin-stdlib
10
Kotlin Nativo/GraalVM
• Lenguaje (Kotlin)
• GraalVM Native
• Bibliotecas/API (Java Classpath)
• kotlin-stdlib
11
Kotlin como lenguaje
• Típado estático con inferencia de
tipos
• OOP y funcional
• Funciones son ciudadanos de
primer nivel
• Interoperable con Java
• Compilador genera Bytecode nivel
Java 6 (Android)
12
Caracteristicas interesantes
Kotlin - Inferencia de tipos (constantes y variables)
Similar a lo visto en TypeScript o Swift, promueve la inmutabilidad
1 // Mutable
2 var answer = 42
3
4 // Inmutable
5 val phrase = "JVM Rocks!"
6
7 // Declaración explicita
8 val pi : Double = "3.14159"
9
10 // Inferencia por retorno
11 val auto = crearAuto()
13
Kotlin - Funciones
Pueden ser top level, nested y a su vez pueden ser bloques o expresiones
1 //Bloque
2 fun sumar(x: Int, y: Int): Int{
3 return x + y
4 }
5
6 //One-line - Expresion y default parameter
7 fun sumar2(x: Int, y: Int = 99) = x + y
8
9 //Infix - AKA operador
10 infix fun Int.sumar3(y: Int) = this + y
11 ...
12 //Uso
13 2 sumar3 4
14
Kotlin - Clases
Todas las clases heredan de Any
1 //Clase
2 class Automovil: Vehiculo{
3 ...
4 constructor(conductor:Persona): super(conductor){
5 ...
6 }
7 }
8
9 //Clase concisa
10 class Automovil(conductor:Persona): Vehiculo(conductor){
11 ...
12 }
15
Kotlin - Propiedades y clases
Combinación del campo y métodos de acceso
1 //Clase
2 class Automovil: Vehiculo{
3 var marca: String
4 var modelo: Int = 2020
5 var motor: String = ""
6 set(value) {
7 field = value + "CC"
8 }
9 get() = field + " extra info"
10 }
16
Kotlin - Clases
Kotlin permite escribir clases y data carriers de forma concisa
1 //Forma corta
2 class Automovil(val marca: String, val color: String="Rojo")
3 ...
4 //Data class (metodos universales como equals, hash code,
toString)
5 data class Automovil(val marca: String,
6 val color: String="Rojo")
17
Kotlin - Object AKA Singleton
Creación de instancias únicas
1 object Automovil: Vehiculo {
2 override fun correr(){
3 ...
4 }
5 }
6
7 //Invocamos comportamiento
8 Automovil.correr()
9
10
11 //Y lo usamos como objeto
12 fun iniciarVehiculo(Automovil)
18
Kotlin - No static keyword
1 class Automovil {
2 companion object {
3 fun correr() {
4 ...
5 }
6 }
7 }
8
9 object Automovil {
10 override fun correr(){
11 ...
12 }
13 }
19
Kotlin - Extension functions
Posibilidad de extender funcionalidad en clases existentes
1 fun String.ultimoCar(): Char = this.get(this.lenght - 1)
2
3 val frase: Char = "Yo amo la JVM".ultimoCar()
20
Kotlin - Verificación de nulos
En Kotlin la verificación de nulos y declaración de variables .abiertas.es explicita
1 val talvez: String? = ...
2
3 talvez.length //Error de compilacion
4 talvez?.length
5
6 fun forzarNull(s: String?) {
7 println(s!!.length)
8 }
21
Kotlin - Smart Cast y Pattern Matching
El casting se da automático en ciertos bloques y expresiones
1 val auto1: Vehiculo = ...
2
3 if (auto1 is Automovil){
4 auto1.cosasDeAutos()
5 }
6
7 when (auto1) {
8 is Automovil -> auto1.cosasDeAutos()
9 is Motocicleta -> auto1.cosasDemotos()
10 else -> throw Exception("El vehiculo de los ojos tristes")
11 }
22
Kotlin - Collections
Metodos convenientes y expresiones lambda, por defecto Inmutables
1 //Con expresiones lambda
2 listOf(1, 2, 3).filter{ i -> i % 2 == 0}
3
4 //Con expresiones cortas (predicado)
5 listOf(1, 2, 3).filter{i % 2 == 0}
23
Kotlin - Convenciones
• Convenciones de nombrado Java
• Típos en Uppercase
• Metodos y propiedades en lower
camelCase
• Punto y coma son opcionales
• Convención reversa en nombrado de
paquetes
• Multiples clases por archivo
• Los paquetes en código no deben
coincidir con nombres de directorios
24
Kotlin para desarrolladores Java
• Lenguaje (Kotlin)
• V8/SpiderMonkey
• Bibliotecas/API (ECMA 6 + Web)
• kotlin-stdlib
25
Demo productiva
Eclipse MicroProfile - 1, 2, 3 with Kotlin
1. Maven or Gradle config
2. MicroProfile dependency and your extras (Jakarta EE, Arquillian, JUnit, . . .)
3. Maven plugin (maven-compiler-plugin)
4. Kotlin plugin (kotlin-maven-plugin)
26
Eclipse MicroProfile with Payara 5
1 <dependency>
2 <groupId>org.eclipse.microprofile</groupId>
3 <artifactId>microprofile</artifactId>
4 <type>pom</type>
5 <version>2.1</version>
6 <scope>provided</scope>
7 </dependency>
27
Kotlin with Maven - Dependency
1 <dependency>
2 <groupId>org.jetbrains.kotlin</groupId>
3 <artifactId>kotlin-stdlib-jdk8</artifactId>
4 <version>${kotlin.version}</version>
5 </dependency>
28
Kotlin with Maven - maven-compiler-plugin
1 <execution>
2 <id>default-compile</id>
3 <phase>none</phase>
4 </execution>
5 <execution>
6 <id>default-testCompile</id>
7 <phase>none</phase>
8 </execution>
9 <execution>
10 <id>java-compile</id>
11 <phase>compile</phase>
12 <goals> <goal>compile</goal> </goals>
13 </execution>
14 <execution>
15 <id>java-test-compile</id>
16 <phase>test-compile</phase>
17 <goals> <goal>testCompile</goal> </goals>
18 </execution>
29
Kotlin with Maven - kotlin-maven-plugin
1 <compilerPlugins>
2 <plugin>all-open</plugin>
3 </compilerPlugins>
4 ...
5 <option>all-open:annotation=javax.ws.rs.Path</option>
6 <option>all-open:annotation=javax.enterprise.context.RequestScoped</option>
7 <option>all-open:annotation=javax.enterprise.context.SessionScoped</option>
8 <option>all-open:annotation=javax.enterprise.context.ApplicationScoped</option>
9 <option>all-open:annotation=javax.enterprise.context.Dependent</option>
10 <option>all-open:annotation=javax.ejb.Singleton</option>
11 <option>all-open:annotation=javax.ejb.Stateful</option>
12 <option>all-open:annotation=javax.ejb.Stateless</option>
Idea general: Agregar todas las anotaciones arquitecturales de JakartaEE (CDI
and EJB)
30
Kotlin + Jakarta EE + MicroProfile - Demo
• Kotlin 1.3
• Libraries - SLF4J, Flyway, PostgreSQL
• Jakarta EE 8 - EJB, JPA
• MicroProfile - CDI, JAX-RS, MicroProfile Config
• Testing - Arquillian, JUnit, Payara Embedded
https://dzone.com/articles/
the-state-of-kotlin-for-jakarta-eemicroprofile-tra
https://github.com/tuxtor/integrum-ee
31
Kotlin + Jakarta EE + MicroProfile - Demo
32
Kotlin + Jakarta EE + MicroProfile - Demo
33
Kotlin - JPA entity
1 @Entity
2 @Table(name = "adm_phrase")
3 @TableGenerator(...)
4 data class AdmPhrase(
5 @Id
6 @GeneratedValue(strategy = GenerationType.TABLE,
7 generator = "admPhraseIdGenerator")
8 @Column(name = "phrase_id")
9 var phraseId:Long? = null,
10 var author:String = "",
11 var phrase:String = ""
12 )
Data Clases, Nullable Types
34
Kotlin - CDI Repository
1 @RequestScoped
2 class AdmPhraseRepository {
3
4 @Inject
5 private lateinit var em:EntityManager
6
7 ...
8
9 }
Lateinit (nullable type)
35
Kotlin - CDI Repository
1 fun create(admPhrase:AdmPhrase) = em.persist(admPhrase)
2
3 fun update(admPhrase:AdmPhrase) = em.merge(admPhrase)
4
5 fun findById(phraseId: Long) =
6 em.find(AdmPhrase::class.java, phraseId)
7
8 fun delete(admPhrase: AdmPhrase) = em.remove(admPhrase)
9 . . .
Single expression functions (One line methods)
36
Kotlin - CDI Repository
1 fun listAll(author: String, phrase: String):
2 List<AdmPhrase> {
3
4 val query = """SELECT p FROM AdmPhrase p
5 where p.author LIKE :author
6 and p.phrase LIKE :phrase
7 """
8
9 return em.createQuery(query, AdmPhrase::class.java)
10 .setParameter("author", " %$author %")
11 .setParameter("phrase", " %$phrase %")
12 .resultList
13 }
Multiline string
37
Kotlin - JAX-RS Controllers
1 @Path("/phrases")
2 @Produces(MediaType.APPLICATION_JSON)
3 @Consumes(MediaType.APPLICATION_JSON)
4 class AdmPhraseController{
5
6 @Inject
7 private lateinit var admPhraseRepository: AdmPhraseRepository
8
9 @Inject
10 private lateinit var logger: Logger
11 ...
12
13 }
38
Kotlin - JAX-RS Controller
1
2 @GET
3 fun findAll(
4 @QueryParam("author") @DefaultValue(" %") author: String,
5 @QueryParam("phrase") @DefaultValue(" %") phrase: String) =
6 admPhraseRepository.listAll(author, phrase)
7
8 @GET
9 @Path("/{id:[0-9][0-9]*}")
10 fun findById(@PathParam("id") id:Long) =
11 admPhraseRepository.findById(id)
12
13 @PUT
14 fun create(phrase: AdmPhrase): Response {
15 admPhraseRepository.create(phrase)
16 return Response.ok().build()
17 }
39
Kotlin - JAX-RS Controller
Elvis operator as expression
1 @POST
2 @Path("/{id:[0-9][0-9]*}")
3 fun update(@PathParam("id") id: Long?, phrase: AdmPhrase)
4 :Response {
5 if(id != phrase.phraseId)
6 return Response.status(Response.Status.NOT_FOUND).build()
7
8 val updatedEntity = admPhraseRepository.update(phrase)
9 return Response.ok(updatedEntity).build()
10 }
11
12 @DELETE
13 @Path("/{id:[0-9][0-9]*}")
14 fun delete(@PathParam("id") id: Long): Response {
15 val updatedEntity = admPhraseRepository.findById(id) ?:
16 return Response.status(Response.Status.NOT_FOUND).build()
17 admPhraseRepository.delete(updatedEntity)
18 return Response.ok().build()
40
Oracle Cloud
1 <groupId>io.fabric8</groupId>
2 <artifactId>docker-maven-plugin</artifactId>
3 <version>0.30.0</version>
4 ...
5 <image>
6 <name>iad.ocir.io/tuxtor/microprofile/integrum-ee</name>
7 <build>
8 <dockerFile>${project.basedir}/Dockerfile</dockerFile >
9 </build>
10 </image>
41
Oracle Cloud
42
Oracle Cloud
43
Oracle Cloud
44
Oracle Cloud
45
Kotlin vs. Java
Kotlin - Cosas más interesantes para mi
• Static typing
• Java inter-op
• OO + FP
• Null safety
• Extension functions
• Operator overloading
• Data classes
• Functions as expressions
46
Kotlin - Datos interesantes
• Effective Java - Immutability, builder,
singleton, override, final by default,
variance by generics
• Elvis - Groovy
• Type inference - Scala
• Immutability - Scala
• Identifiers - Scala
• Null values management - Groovy
• Functions - Groovy
47
Java - Muriendo desde 1995
• Spring Boot, Micronaut, MicroProfile,
GraalVM . . .
• Raw performance (Beam, Spark,
Hadoop)
• Tooling - IDE, Maven, Drivers RDBMS
• JVM - (Twitter, Alibaba, Spotify, etc.)
• OpenJDK
48
Kotlin
Ventajas
• Código conciso si se aprenden los
nuevos bloques y expresiones
• Java inter-op
• Una oportunidad de Backend para
desarrolladores Android
• Un nuevo abordaje ”Full-stack”
Desventajas
• IntelliJ IDEA Ultimate
• Curva de aprendizaje más
pronunciada
• Compiler (time)
• Thread-managed vs Co-routines
• Amber, Loom, Valhalla, Panama
(Java 18?)
49
Academik
50
Víctor Orozco
• vorozco@nabenik.com
• @tuxtor
• https://vorozco.com
This work is licensed under a
Creative Commons
Attribution-ShareAlike 3.0.
51

Weitere ähnliche Inhalte

Was ist angesagt?

(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!Alonso Torres
 
Fundamentos de la Refactorización
Fundamentos de la RefactorizaciónFundamentos de la Refactorización
Fundamentos de la RefactorizaciónJavier Pérez
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018 Codemotion
 
Lenguaje Java
Lenguaje JavaLenguaje Java
Lenguaje Javapbcanessa
 
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRootedCON
 
Apache Storm: Instalación
Apache Storm: InstalaciónApache Storm: Instalación
Apache Storm: InstalaciónStratebi
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaSoftware Guru
 
UYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresUYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresNelson Calero
 
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...RootedCON
 
UYOUG OTN Tour 2011 - RAC sin sorpresas
UYOUG OTN Tour 2011 - RAC sin sorpresasUYOUG OTN Tour 2011 - RAC sin sorpresas
UYOUG OTN Tour 2011 - RAC sin sorpresasNelson Calero
 
Información básica Java
Información básica JavaInformación básica Java
Información básica JavaFordBull2er
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Java y sus caracteristicas
Java y sus caracteristicasJava y sus caracteristicas
Java y sus caracteristicasAny Saula
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en javaLuis Miguel De Bello
 

Was ist angesagt? (20)

Java 1.4 to java 6
Java 1.4 to java 6Java 1.4 to java 6
Java 1.4 to java 6
 
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
 
Fundamentos de la Refactorización
Fundamentos de la RefactorizaciónFundamentos de la Refactorización
Fundamentos de la Refactorización
 
[Run Reloaded] Estrategias de Caching Distribuído con Microsoft Velocity Proj...
[Run Reloaded] Estrategias de Caching Distribuído con Microsoft Velocity Proj...[Run Reloaded] Estrategias de Caching Distribuído con Microsoft Velocity Proj...
[Run Reloaded] Estrategias de Caching Distribuído con Microsoft Velocity Proj...
 
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018  Jerónimo López | Introducción a GraalVM | Codemotion Madrid  2018
Jerónimo López | Introducción a GraalVM | Codemotion Madrid 2018
 
Lenguaje Java
Lenguaje JavaLenguaje Java
Lenguaje Java
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_moralesRooted2020 encontrando 0days-en_2020_-_antonio_morales
Rooted2020 encontrando 0days-en_2020_-_antonio_morales
 
Hibernate - JPA @luce
Hibernate - JPA @luceHibernate - JPA @luce
Hibernate - JPA @luce
 
Apache Storm: Instalación
Apache Storm: InstalaciónApache Storm: Instalación
Apache Storm: Instalación
 
Comandos java
Comandos javaComandos java
Comandos java
 
Realizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficaciaRealizando pruebas en la JVM con velocidad y eficacia
Realizando pruebas en la JVM con velocidad y eficacia
 
UYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresUYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New features
 
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palom...
 
UYOUG OTN Tour 2011 - RAC sin sorpresas
UYOUG OTN Tour 2011 - RAC sin sorpresasUYOUG OTN Tour 2011 - RAC sin sorpresas
UYOUG OTN Tour 2011 - RAC sin sorpresas
 
Información básica Java
Información básica JavaInformación básica Java
Información básica Java
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Java y sus caracteristicas
Java y sus caracteristicasJava y sus caracteristicas
Java y sus caracteristicas
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en java
 
Overview atlas (1)
Overview atlas (1)Overview atlas (1)
Overview atlas (1)
 

Ähnlich wie Introducción a Kotlin para desarrolladores Java

Ähnlich wie Introducción a Kotlin para desarrolladores Java (20)

Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006Curso Java Resumen - Curso 2005-2006
Curso Java Resumen - Curso 2005-2006
 
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browserTypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
TypeScript para Javeros. Por fin un lenguaje 'de verdad' en el browser
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Java 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and moreJava 9, 10, 11 ,12, 13 and more
Java 9, 10, 11 ,12, 13 and more
 
Frameworks de templates y xml
Frameworks de templates y xmlFrameworks de templates y xml
Frameworks de templates y xml
 
Mobile Day - Kotlin
Mobile Day - KotlinMobile Day - Kotlin
Mobile Day - Kotlin
 
Curso de javascript desde cero
Curso de javascript desde ceroCurso de javascript desde cero
Curso de javascript desde cero
 
Consideraciones pragmatica
Consideraciones pragmaticaConsideraciones pragmatica
Consideraciones pragmatica
 
Tipos de datos
Tipos de datosTipos de datos
Tipos de datos
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
Javaqert
JavaqertJavaqert
Javaqert
 
Javaqert
JavaqertJavaqert
Javaqert
 
Java 8 - Nuevas características
Java 8 - Nuevas característicasJava 8 - Nuevas características
Java 8 - Nuevas características
 
Programacion orientada a objetos 2
Programacion orientada a objetos 2Programacion orientada a objetos 2
Programacion orientada a objetos 2
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Tema 1[1][1]
Tema 1[1][1]Tema 1[1][1]
Tema 1[1][1]
 

Mehr von Víctor Leonel Orozco López

Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenVíctor Leonel Orozco López
 
Desde la TV, hasta la nube, el ecosistema de Java en 26 años
Desde la TV, hasta la nube, el ecosistema de Java en 26 añosDesde la TV, hasta la nube, el ecosistema de Java en 26 años
Desde la TV, hasta la nube, el ecosistema de Java en 26 añosVíctor Leonel Orozco López
 
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...Víctor Leonel Orozco López
 
Explorando los objetos centrales de Kubernetes con Oracle Cloud
Explorando los objetos centrales de Kubernetes con Oracle CloudExplorando los objetos centrales de Kubernetes con Oracle Cloud
Explorando los objetos centrales de Kubernetes con Oracle CloudVíctor Leonel Orozco López
 
Design Patterns para Microsserviços com MicroProfile
 Design Patterns para Microsserviços com MicroProfile Design Patterns para Microsserviços com MicroProfile
Design Patterns para Microsserviços com MicroProfileVíctor Leonel Orozco López
 
MicroProfile benefits for your monolithic applications
MicroProfile benefits for your monolithic applicationsMicroProfile benefits for your monolithic applications
MicroProfile benefits for your monolithic applicationsVíctor Leonel Orozco López
 
Consejos y el camino del desarrollador de software
Consejos y el camino del desarrollador de softwareConsejos y el camino del desarrollador de software
Consejos y el camino del desarrollador de softwareVíctor Leonel Orozco López
 
Empaquetando aplicaciones Java con Docker y Kubernetes
Empaquetando aplicaciones Java con Docker y KubernetesEmpaquetando aplicaciones Java con Docker y Kubernetes
Empaquetando aplicaciones Java con Docker y KubernetesVíctor Leonel Orozco López
 
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeKotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeVíctor Leonel Orozco López
 
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem nova
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem novaKotlin+MicroProfile: Ensinando 20 anos para uma linguagem nova
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem novaVíctor Leonel Orozco López
 
Eclipse MicroProfile para el desarrollador ocupado
Eclipse MicroProfile para el desarrollador ocupadoEclipse MicroProfile para el desarrollador ocupado
Eclipse MicroProfile para el desarrollador ocupadoVíctor Leonel Orozco López
 

Mehr von Víctor Leonel Orozco López (20)

Introducción al análisis de datos
Introducción al análisis de datosIntroducción al análisis de datos
Introducción al análisis de datos
 
From traditional to GitOps
From traditional to GitOpsFrom traditional to GitOps
From traditional to GitOps
 
De Java 8 a Java 17
De Java 8 a Java 17De Java 8 a Java 17
De Java 8 a Java 17
 
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
 
Desde la TV, hasta la nube, el ecosistema de Java en 26 años
Desde la TV, hasta la nube, el ecosistema de Java en 26 añosDesde la TV, hasta la nube, el ecosistema de Java en 26 años
Desde la TV, hasta la nube, el ecosistema de Java en 26 años
 
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
Bootstraping real world Jakarta EE/MicroProfile microservices with Maven Arch...
 
Explorando los objetos centrales de Kubernetes con Oracle Cloud
Explorando los objetos centrales de Kubernetes con Oracle CloudExplorando los objetos centrales de Kubernetes con Oracle Cloud
Explorando los objetos centrales de Kubernetes con Oracle Cloud
 
Desarrollo moderno con DevOps y Cloud Native
Desarrollo moderno con DevOps y Cloud NativeDesarrollo moderno con DevOps y Cloud Native
Desarrollo moderno con DevOps y Cloud Native
 
Design Patterns para Microsserviços com MicroProfile
 Design Patterns para Microsserviços com MicroProfile Design Patterns para Microsserviços com MicroProfile
Design Patterns para Microsserviços com MicroProfile
 
Gestión de proyectos con Maven
Gestión de proyectos con MavenGestión de proyectos con Maven
Gestión de proyectos con Maven
 
MicroProfile benefits for your monolithic applications
MicroProfile benefits for your monolithic applicationsMicroProfile benefits for your monolithic applications
MicroProfile benefits for your monolithic applications
 
Consejos y el camino del desarrollador de software
Consejos y el camino del desarrollador de softwareConsejos y el camino del desarrollador de software
Consejos y el camino del desarrollador de software
 
De Java 8 ate Java 14
De Java 8 ate Java 14De Java 8 ate Java 14
De Java 8 ate Java 14
 
Programación con ECMA6 y TypeScript
Programación con ECMA6 y TypeScriptProgramación con ECMA6 y TypeScript
Programación con ECMA6 y TypeScript
 
Empaquetando aplicaciones Java con Docker y Kubernetes
Empaquetando aplicaciones Java con Docker y KubernetesEmpaquetando aplicaciones Java con Docker y Kubernetes
Empaquetando aplicaciones Java con Docker y Kubernetes
 
De Java 8 a Java 11 y 14
De Java 8 a Java 11 y 14De Java 8 a Java 11 y 14
De Java 8 a Java 11 y 14
 
MicroProfile benefits for monolitic applications
MicroProfile benefits for monolitic applicationsMicroProfile benefits for monolitic applications
MicroProfile benefits for monolitic applications
 
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguajeKotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
Kotlin+MicroProfile: Enseñando trucos de 20 años a un nuevo lenguaje
 
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem nova
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem novaKotlin+MicroProfile: Ensinando 20 anos para uma linguagem nova
Kotlin+MicroProfile: Ensinando 20 anos para uma linguagem nova
 
Eclipse MicroProfile para el desarrollador ocupado
Eclipse MicroProfile para el desarrollador ocupadoEclipse MicroProfile para el desarrollador ocupado
Eclipse MicroProfile para el desarrollador ocupado
 

Kürzlich hochgeladen

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 

Kürzlich hochgeladen (15)

International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 

Introducción a Kotlin para desarrolladores Java

  • 1. Introducción a Kotlin para desarrolladores Java Víctor Orozco 6 de mayo de 2020 @tuxtor 1
  • 4. ¿Java? • Lenguaje (Java 11) • OpenJDK (Java Virtual Machine) • Bibliotecas/API (Java Classpath) El conjunto de los 3 es la plataforma Java(TM) pero pueden usarse de forma independiente 3
  • 5. Java en Android • Lenguaje (Java 7) • ART/Dalvik • Bibliotecas/API (Java+Google Classpath) 4
  • 6. Java - Java como JVM 5
  • 8. Kotlin • Lenguaje (Kotlin) • OpenJDK (Java Virtual Machine) • Bibliotecas/API (Java Classpath) • kotlin-stdlib 7
  • 9. Kotlin en Android • Lenguaje (Kotlin) • ART/Dalvik • Bibliotecas/API (Java+Google Classpath) • kotlin-stdlib 8
  • 10. Kotlin en JS • Lenguaje (Kotlin) • V8/SpiderMonkey • Bibliotecas/API (ECMA 6 + Web) • kotlin-stdlib 9
  • 11. Kotlin Nativo • Lenguaje (Kotlin) • LLVM • GLibc (Linux) • kotlin-stdlib 10
  • 12. Kotlin Nativo/GraalVM • Lenguaje (Kotlin) • GraalVM Native • Bibliotecas/API (Java Classpath) • kotlin-stdlib 11
  • 13. Kotlin como lenguaje • Típado estático con inferencia de tipos • OOP y funcional • Funciones son ciudadanos de primer nivel • Interoperable con Java • Compilador genera Bytecode nivel Java 6 (Android) 12
  • 15. Kotlin - Inferencia de tipos (constantes y variables) Similar a lo visto en TypeScript o Swift, promueve la inmutabilidad 1 // Mutable 2 var answer = 42 3 4 // Inmutable 5 val phrase = "JVM Rocks!" 6 7 // Declaración explicita 8 val pi : Double = "3.14159" 9 10 // Inferencia por retorno 11 val auto = crearAuto() 13
  • 16. Kotlin - Funciones Pueden ser top level, nested y a su vez pueden ser bloques o expresiones 1 //Bloque 2 fun sumar(x: Int, y: Int): Int{ 3 return x + y 4 } 5 6 //One-line - Expresion y default parameter 7 fun sumar2(x: Int, y: Int = 99) = x + y 8 9 //Infix - AKA operador 10 infix fun Int.sumar3(y: Int) = this + y 11 ... 12 //Uso 13 2 sumar3 4 14
  • 17. Kotlin - Clases Todas las clases heredan de Any 1 //Clase 2 class Automovil: Vehiculo{ 3 ... 4 constructor(conductor:Persona): super(conductor){ 5 ... 6 } 7 } 8 9 //Clase concisa 10 class Automovil(conductor:Persona): Vehiculo(conductor){ 11 ... 12 } 15
  • 18. Kotlin - Propiedades y clases Combinación del campo y métodos de acceso 1 //Clase 2 class Automovil: Vehiculo{ 3 var marca: String 4 var modelo: Int = 2020 5 var motor: String = "" 6 set(value) { 7 field = value + "CC" 8 } 9 get() = field + " extra info" 10 } 16
  • 19. Kotlin - Clases Kotlin permite escribir clases y data carriers de forma concisa 1 //Forma corta 2 class Automovil(val marca: String, val color: String="Rojo") 3 ... 4 //Data class (metodos universales como equals, hash code, toString) 5 data class Automovil(val marca: String, 6 val color: String="Rojo") 17
  • 20. Kotlin - Object AKA Singleton Creación de instancias únicas 1 object Automovil: Vehiculo { 2 override fun correr(){ 3 ... 4 } 5 } 6 7 //Invocamos comportamiento 8 Automovil.correr() 9 10 11 //Y lo usamos como objeto 12 fun iniciarVehiculo(Automovil) 18
  • 21. Kotlin - No static keyword 1 class Automovil { 2 companion object { 3 fun correr() { 4 ... 5 } 6 } 7 } 8 9 object Automovil { 10 override fun correr(){ 11 ... 12 } 13 } 19
  • 22. Kotlin - Extension functions Posibilidad de extender funcionalidad en clases existentes 1 fun String.ultimoCar(): Char = this.get(this.lenght - 1) 2 3 val frase: Char = "Yo amo la JVM".ultimoCar() 20
  • 23. Kotlin - Verificación de nulos En Kotlin la verificación de nulos y declaración de variables .abiertas.es explicita 1 val talvez: String? = ... 2 3 talvez.length //Error de compilacion 4 talvez?.length 5 6 fun forzarNull(s: String?) { 7 println(s!!.length) 8 } 21
  • 24. Kotlin - Smart Cast y Pattern Matching El casting se da automático en ciertos bloques y expresiones 1 val auto1: Vehiculo = ... 2 3 if (auto1 is Automovil){ 4 auto1.cosasDeAutos() 5 } 6 7 when (auto1) { 8 is Automovil -> auto1.cosasDeAutos() 9 is Motocicleta -> auto1.cosasDemotos() 10 else -> throw Exception("El vehiculo de los ojos tristes") 11 } 22
  • 25. Kotlin - Collections Metodos convenientes y expresiones lambda, por defecto Inmutables 1 //Con expresiones lambda 2 listOf(1, 2, 3).filter{ i -> i % 2 == 0} 3 4 //Con expresiones cortas (predicado) 5 listOf(1, 2, 3).filter{i % 2 == 0} 23
  • 26. Kotlin - Convenciones • Convenciones de nombrado Java • Típos en Uppercase • Metodos y propiedades en lower camelCase • Punto y coma son opcionales • Convención reversa en nombrado de paquetes • Multiples clases por archivo • Los paquetes en código no deben coincidir con nombres de directorios 24
  • 27. Kotlin para desarrolladores Java • Lenguaje (Kotlin) • V8/SpiderMonkey • Bibliotecas/API (ECMA 6 + Web) • kotlin-stdlib 25
  • 29. Eclipse MicroProfile - 1, 2, 3 with Kotlin 1. Maven or Gradle config 2. MicroProfile dependency and your extras (Jakarta EE, Arquillian, JUnit, . . .) 3. Maven plugin (maven-compiler-plugin) 4. Kotlin plugin (kotlin-maven-plugin) 26
  • 30. Eclipse MicroProfile with Payara 5 1 <dependency> 2 <groupId>org.eclipse.microprofile</groupId> 3 <artifactId>microprofile</artifactId> 4 <type>pom</type> 5 <version>2.1</version> 6 <scope>provided</scope> 7 </dependency> 27
  • 31. Kotlin with Maven - Dependency 1 <dependency> 2 <groupId>org.jetbrains.kotlin</groupId> 3 <artifactId>kotlin-stdlib-jdk8</artifactId> 4 <version>${kotlin.version}</version> 5 </dependency> 28
  • 32. Kotlin with Maven - maven-compiler-plugin 1 <execution> 2 <id>default-compile</id> 3 <phase>none</phase> 4 </execution> 5 <execution> 6 <id>default-testCompile</id> 7 <phase>none</phase> 8 </execution> 9 <execution> 10 <id>java-compile</id> 11 <phase>compile</phase> 12 <goals> <goal>compile</goal> </goals> 13 </execution> 14 <execution> 15 <id>java-test-compile</id> 16 <phase>test-compile</phase> 17 <goals> <goal>testCompile</goal> </goals> 18 </execution> 29
  • 33. Kotlin with Maven - kotlin-maven-plugin 1 <compilerPlugins> 2 <plugin>all-open</plugin> 3 </compilerPlugins> 4 ... 5 <option>all-open:annotation=javax.ws.rs.Path</option> 6 <option>all-open:annotation=javax.enterprise.context.RequestScoped</option> 7 <option>all-open:annotation=javax.enterprise.context.SessionScoped</option> 8 <option>all-open:annotation=javax.enterprise.context.ApplicationScoped</option> 9 <option>all-open:annotation=javax.enterprise.context.Dependent</option> 10 <option>all-open:annotation=javax.ejb.Singleton</option> 11 <option>all-open:annotation=javax.ejb.Stateful</option> 12 <option>all-open:annotation=javax.ejb.Stateless</option> Idea general: Agregar todas las anotaciones arquitecturales de JakartaEE (CDI and EJB) 30
  • 34. Kotlin + Jakarta EE + MicroProfile - Demo • Kotlin 1.3 • Libraries - SLF4J, Flyway, PostgreSQL • Jakarta EE 8 - EJB, JPA • MicroProfile - CDI, JAX-RS, MicroProfile Config • Testing - Arquillian, JUnit, Payara Embedded https://dzone.com/articles/ the-state-of-kotlin-for-jakarta-eemicroprofile-tra https://github.com/tuxtor/integrum-ee 31
  • 35. Kotlin + Jakarta EE + MicroProfile - Demo 32
  • 36. Kotlin + Jakarta EE + MicroProfile - Demo 33
  • 37. Kotlin - JPA entity 1 @Entity 2 @Table(name = "adm_phrase") 3 @TableGenerator(...) 4 data class AdmPhrase( 5 @Id 6 @GeneratedValue(strategy = GenerationType.TABLE, 7 generator = "admPhraseIdGenerator") 8 @Column(name = "phrase_id") 9 var phraseId:Long? = null, 10 var author:String = "", 11 var phrase:String = "" 12 ) Data Clases, Nullable Types 34
  • 38. Kotlin - CDI Repository 1 @RequestScoped 2 class AdmPhraseRepository { 3 4 @Inject 5 private lateinit var em:EntityManager 6 7 ... 8 9 } Lateinit (nullable type) 35
  • 39. Kotlin - CDI Repository 1 fun create(admPhrase:AdmPhrase) = em.persist(admPhrase) 2 3 fun update(admPhrase:AdmPhrase) = em.merge(admPhrase) 4 5 fun findById(phraseId: Long) = 6 em.find(AdmPhrase::class.java, phraseId) 7 8 fun delete(admPhrase: AdmPhrase) = em.remove(admPhrase) 9 . . . Single expression functions (One line methods) 36
  • 40. Kotlin - CDI Repository 1 fun listAll(author: String, phrase: String): 2 List<AdmPhrase> { 3 4 val query = """SELECT p FROM AdmPhrase p 5 where p.author LIKE :author 6 and p.phrase LIKE :phrase 7 """ 8 9 return em.createQuery(query, AdmPhrase::class.java) 10 .setParameter("author", " %$author %") 11 .setParameter("phrase", " %$phrase %") 12 .resultList 13 } Multiline string 37
  • 41. Kotlin - JAX-RS Controllers 1 @Path("/phrases") 2 @Produces(MediaType.APPLICATION_JSON) 3 @Consumes(MediaType.APPLICATION_JSON) 4 class AdmPhraseController{ 5 6 @Inject 7 private lateinit var admPhraseRepository: AdmPhraseRepository 8 9 @Inject 10 private lateinit var logger: Logger 11 ... 12 13 } 38
  • 42. Kotlin - JAX-RS Controller 1 2 @GET 3 fun findAll( 4 @QueryParam("author") @DefaultValue(" %") author: String, 5 @QueryParam("phrase") @DefaultValue(" %") phrase: String) = 6 admPhraseRepository.listAll(author, phrase) 7 8 @GET 9 @Path("/{id:[0-9][0-9]*}") 10 fun findById(@PathParam("id") id:Long) = 11 admPhraseRepository.findById(id) 12 13 @PUT 14 fun create(phrase: AdmPhrase): Response { 15 admPhraseRepository.create(phrase) 16 return Response.ok().build() 17 } 39
  • 43. Kotlin - JAX-RS Controller Elvis operator as expression 1 @POST 2 @Path("/{id:[0-9][0-9]*}") 3 fun update(@PathParam("id") id: Long?, phrase: AdmPhrase) 4 :Response { 5 if(id != phrase.phraseId) 6 return Response.status(Response.Status.NOT_FOUND).build() 7 8 val updatedEntity = admPhraseRepository.update(phrase) 9 return Response.ok(updatedEntity).build() 10 } 11 12 @DELETE 13 @Path("/{id:[0-9][0-9]*}") 14 fun delete(@PathParam("id") id: Long): Response { 15 val updatedEntity = admPhraseRepository.findById(id) ?: 16 return Response.status(Response.Status.NOT_FOUND).build() 17 admPhraseRepository.delete(updatedEntity) 18 return Response.ok().build() 40
  • 44. Oracle Cloud 1 <groupId>io.fabric8</groupId> 2 <artifactId>docker-maven-plugin</artifactId> 3 <version>0.30.0</version> 4 ... 5 <image> 6 <name>iad.ocir.io/tuxtor/microprofile/integrum-ee</name> 7 <build> 8 <dockerFile>${project.basedir}/Dockerfile</dockerFile > 9 </build> 10 </image> 41
  • 50. Kotlin - Cosas más interesantes para mi • Static typing • Java inter-op • OO + FP • Null safety • Extension functions • Operator overloading • Data classes • Functions as expressions 46
  • 51. Kotlin - Datos interesantes • Effective Java - Immutability, builder, singleton, override, final by default, variance by generics • Elvis - Groovy • Type inference - Scala • Immutability - Scala • Identifiers - Scala • Null values management - Groovy • Functions - Groovy 47
  • 52. Java - Muriendo desde 1995 • Spring Boot, Micronaut, MicroProfile, GraalVM . . . • Raw performance (Beam, Spark, Hadoop) • Tooling - IDE, Maven, Drivers RDBMS • JVM - (Twitter, Alibaba, Spotify, etc.) • OpenJDK 48
  • 53. Kotlin Ventajas • Código conciso si se aprenden los nuevos bloques y expresiones • Java inter-op • Una oportunidad de Backend para desarrolladores Android • Un nuevo abordaje ”Full-stack” Desventajas • IntelliJ IDEA Ultimate • Curva de aprendizaje más pronunciada • Compiler (time) • Thread-managed vs Co-routines • Amber, Loom, Valhalla, Panama (Java 18?) 49
  • 55. Víctor Orozco • vorozco@nabenik.com • @tuxtor • https://vorozco.com This work is licensed under a Creative Commons Attribution-ShareAlike 3.0. 51