Chi sono
Mi chiamo Davide Cerbo e scrivo codice brutto da quando avevo 7
anni, dal 2003 mi pagano per farlo.
Il grande problema
Backward compatibility (L’arte di rompere la tua applicazione perché le altre evolvono e la tua non può.)
JDK 1.0 (21 gennaio 1996)JDK 1.1 (19 febbraio 1997)J2SE 1.2 (8 dicembre 1998)J2SE 1.3 (8 maggio 2000)J2SE 1.4 (6 febbraio 2002)
J2SE 5.0 (30 settembre 2004)Java SE 6 (11 dicembre 2006)
Java SE 7 (28 luglio 2011)Java SE 8 (18 marzo 2014)
Tutte compatibili!
Kotlin is a statically-typed programming language that runs on the Java Virtual Machine and also can be compiled to JavaScript source code or uses the LLVM compiler infrastructure.
Fun
fun main(args: Array<String>){
hello(“Davide, “Salerno”)
}
fun hello(name: String, city: String){
println(“Ciao $name da $city”)
}
Fun fun functions
fun hello(name: String, city : String = "Salerno") = println("Ciao $name da $city")
hello(name=”Davide”)
hello(city=”Salerno”, name=”Valentina”)
Int.multiply(x:int) = this * 5
infix Int.multiply(x:int) = this * 5
tailrec fun factorial(accumulator: Int, n: Int): Int = if (n == 1) accumulator else factorial(accumulator * n, n - 1)
Nella vita ci vuole Class?
open class Person(val name: String) {
init { println(“init…”) }
open fun speak() { println("Hi $name!") }
infix fun and(o: Person) = "Hi ${o.name} & ${this.name}"
}
Person(“Davide”) and Person(“Valentina”)
Equals, hashCode, toString e copy, mai più!
data class User(val name: String, val age: Int)
val davide = User(“Davide”, 35)val davideJunior = davide.copy(age=0)
val (name, age) = davide println("$name $age years old")
Lambda
arrayOf("ciao", "davide").forEach { println("Hello $it!") }
val doubled = ints.map { value -> value * 2 }
val doubled = ints.map { it * 2 }
class Customer(name: String) : Person(name) { fun forEach(action: (line: Char) -> Unit) = name.forEach(action) fun hello(action: (line: String) -> String) = "Hello ${action.invoke(name)}" }
Tu dimmi quando, quando...
fun describe(obj: Any): String = when (obj) { 1 -> "One" "Hello" -> "Greeting" is Long -> "Long" !is String -> "Not a string" else -> "Unknown" }
describe(Person(“davide”))
Null è sicuro
var test:String = "ciao" test = null
var test:String? = "ciao" test = null
println(test?.length)
println(test!!.length)
val davide = User(test, 35)
val davide = User(test ?: "Mino", 35)
A questo punto mi devo ricordare di dire che è bello perché è semplice.
Scriviamo meno e con maggiore significato.
Deploy con Apache Tomcat
git clone [email protected]:JetBrains/kotlin-examples.git
cd kotlin-examples/tutorials/servlet-web-applications/
gradle war
curl -O http://apache.panu.it/tomcat/tomcat-9/v9.0.0.M21/bin/apache-tomcat-9.0.0.M21.zip
unzip apache-tomcat-9.0.0.M21.zip
cp build/servlet-web-applications.war apache-tomcat-9.0.0.M21/webapp
cd apache-tomcat-9.0.0.M21/bin
./startup.sh
http://localhost:8080/servlet-web-applications/hello
Cosa ci siamo persi?
● Spring WebFlux● Reactor● Coroutine● Gradle + Kotlin● Android + Kotlin● Javascript + Kotlin● Native + Kotlin● Spring 5 + Kotlin● JUnit + Kotlin
Risorse utili
https://kotlinlang.org/docs/reference/
https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0
https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/
https://dev.to/lovis/gang-of-four-patterns-in-kotlin
https://github.com/gradle/gradle-script-kotlin
https://speakerdeck.com/sdeleuze/functional-web-applications-with-spring-and-kotlin
https://kotlinlang.org/docs/tutorials/httpservlets.html