Betekintés: Háber János - Scala, A Java jövője

Figyelem! Ez itt a doksi tartalma kivonata.
Kérlek kattints ide, ha a dokumentum olvasóban szeretnéd megnézni!




Scala
A Java jövője

Háber János



Scala > Java?
- JVM-en fut
- Típusos
- Teljesen objektum orientált
- Funkcionális programozás támogatása
- Minta illesztés
- Többszörös öröklődés (Mixin)
- Implicit konverzió
- Actor alapú konkurencia kezelés
- Ruby szerű szintaxis
és még sok minden



Scala + Java
- Egyszerre használható Java és Scala
ugyanabban a projektben
- Használhatók a meglévő Java libek
- IDE támogatás
- Ha valami nem megy, csináld Jávában




Teljesen Objektum orientált
//Minden érték egy objektum
1.toString
//Minden művelet egy metódus hívás
1 + 2 + 3 -> (1).+(2).+(3)
// . és ( ) elhagyható
"abc" charAt 1 -> "abc".charAt(1)




Hello World
//Java
public class HelloWorld {
public static void main(String[] args) {
String message = "Hello World";
System.out.println(message);
}
}

//Scala
object HelloWorld {
def main(args:Array[String]):Unit = {
val message = "Hello World"
println(message)
}
}




Singleton támogatás
object Hello {
def world = "Hello World"
}
Hello.world

//Hello$.class
import scala.ScalaObject;
public final class Hello$ implements ScalaObject {
private Hello$() { MODULE$ = this; }
public String world() { return "Hello World"; }
public static final MODULE$;
static
{
new ();
}
}
//Hello.class
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes="...removed...")
public final class Hello
{
public static final String world()
{
return Hello..MODULE$.world();
}
}




Automatikus getter/setter
class SimpleVal {
val finalValue: String = "hi"
var simpleVariable: String = ""
}

import scala.ScalaObject;
import scala.reflect.ScalaSignature;
@ScalaSignature(bytes = "...removed...")
public class SimpleVal
implements ScalaObject {
private final String finalValue = "hi";
private String simpleVariable = "";
public String finalValue() {
return this.finalValue;
}
public String simpleVariable() {
return this.simpleVariable;
}
public void simpleVariable_$eq(String
paramString) {
this.simpleVariable = paramString;
}
}




Scala - tömör
//Java
public class Person {
private final String name;
private final int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}

//Scala
class Person(val name:String, val age:Int)




Scala - tömör
//Java

//Scala

public class Person {
private String name;
private int age;
public Person(String name,int age) {
this.name = name;
this.age = age;
}

import reflect.BeanProperty

public String getName() {
return name;
}
public int setName(String name) {
this.name=name;
}
public String getAge() {
return age;
}
public int setAge(String age) {
this.age=age;
}
}

class Person {
@BeanProperty
var name: String = _
@BeanProperty
var age: Int = _
}




Típus következtetés
val sum = 1 + 2 + 3
val nums = List(1, 2, 3)
val map = Map("abc" -> List(1, 2, 3))
val sum: Int = 1 + 2 + 3
val nums: List[Int] = List(1, 2, 3)
val map: Map[String, List[Int]] = Map("abc" -> List(1, 2, 3))




Duck typing
object BigDuck {
def quack(value: String) = {
value.toUpperCase
}
}
object SmallDuck {
def quack(value: String) = {
value.toLowerCase
}
}
object IamNotReallyADuck {
def quack(value: String) = {
"prrrrrp"
}
}

def quacker(duck: {def quack(value: String): String}) {
println (duck.quack("Quack"))
}
quacker(BigDuck)
quacker(SmallDuck)
quacker(IamNotReallyADuck)

class MyDao[T <: {def id : K}, K]




High-order funkciók
def transaction(function: => Any): Any = {
//...
}
transaction {
//here your database code
}




High-order funkciók
def measure[T](func: => T):T = {
val start = Sy
Figyelem! Ez itt a doksi tartalma kivonata.
Kérlek kattints ide, ha a dokumentum olvasóban szeretnéd megnézni!


stem.nanoTime()
val result = func
val elapsed = System.nanoTime() - start
println("The execution of this call took: %s ns".format(elapsed))
result
}
def myCallback = {
Thread.sleep(1000)
"I'm a callback"
}
val result = measure(myCallback)
> The execution of this call took: 1002449000 ns




High-order funkciók
import org.scalatest.FunSuite
import scala.collection.mutable.Stack
class ExampleSuite extends FunSuite {
test("pop is invoked on an empty stack") {
val emptyStack = new Stack[Int]
intercept[NoSuchElementException] {
emptyStack.pop()
}
assert(emptyStack.isEmpty)
}
}




Scala - minta illesztés
- Hasonló a Java switch-hez
- Bármilyen típusú adatra használható
- Első találat szabály
def matchTest(x: Any): Any = x match {
case 1 | 2 | 3 => "one"
case "two" => 2
case a: Int if (a > 100) => a - 3
case b: Int => b + 3
case _ => "None of above"
}




Option
def div(a:Int)(b:Int):Option[Int] = if (b <= 0) None
else if (a < b) Some(0)
else Some(1 + div(a - b)(b).get)
div(25)(5) // => Some(5)
div(150)(2) // => Some(75)
div(13)(4) // => Some(3)
div(13)(0)
div(25)(-5)

// => None
// => None

div(13)(0) match {
case Some(x) => println(x)
case None => println("Problems")
}
// => prints "Problems"
div(25)(5) match {
case Some(x) => println(x)
case None => println("Problems")
}
// => prints "5"




Implicit konverzió
implicit def doubleToInt(d: Double) = d.toInt
val x: Int = 42.0

//Java
public <T> void javaNoManifest(Class<T> clazz) {
//...
}

//Scala
def manifestTest[T](implicit m:Manifest[T]) = {
m.runtimeClass
}




Operátor túlterhelés
class Complex(val real : Double, val imag : Double) {
def +(that: Complex) =
new Complex(this.real + that.real, this.imag + that.imag)
def -(that: Complex) =
new Complex(this.real - that.real, this.imag - that.imag)
override def toString = real + " + " + imag + "i"
}
object Complex {
def main(args : Array[String]) : Unit = {
var a = new Complex(4.0,5.0)
var b = new Complex(2.0,3.0)
println(a) // 4.0 + 5.0i
println(a + b) // 6.0 + 8.0i
println(a - b) // 2.0 + 2.0i
}
}




Trait-ek
//Hasonló a Java interfacehez
trait Language {
val name:String
//De tartalmazhat implementációt is
override def toString = name
}




Trait-ek
trait JVM {
override def toString = super.toString + " runs on JVM"
}
trait Static {
override def toString = super.toString + " is Static"
}
//A trait-ek összefűzhetők (a sorrend számít!)
class Scala extends Language with JVM with Static {
val name="Scala"
}
println(new Scala()) // -> "Scala runs on JVM is Static"




Trait-ek
trait Quacking {
def quack() = {
println("Quack quack quack!")
}
}
class Duck {
val version = "ACME Inc. Generic Duck v1.0"
}
val aDuck = new Duck with Quacking
aDuck.quack()




Case Class
abstract class Term
case class Var(name: String) extends Term
case class Fun(arg: String, body: Term) extends Term
case class App(f: Term, v: Term) extends Term

def printTerm(term: Term) {
term match {
case Var(n) =>
print(n)

val x1 = Var("x")
val x2 = Var("x")
val y1 = Var("y")
println("" + x1 + " == " + x2 + " => " + (x1 == x2))
println("" + x1 + " == " + y1 + " => " + (x1 == y1))

case Fun(x, b) =>
print("^" + x + ".")
printTerm(b)
case App(f, v) =>
Console.print("(")
printTerm(f)
print(" ")
printTerm(v)
print(")")

Var(x) == Var(x) => true
Var(x) == Var(y) => false

}
}




Scala Java Interoperability
class Companion {
def hello() { println("Hello (class)") } // [1]
}
object Companion {
def hallo() { println("Hallo (object)") } // [2]
def hello() { println("Hello (object)") } // [3]
}

public class TestCo
Figyelem! Ez itt a doksi tartalma kivonata.
Kérlek kattints ide, ha a dokumentum olvasóban szeretnéd megnézni!


mpanion {
public static void main(String[] args) {
new Companion().hello(); // [1]
Companion.hallo(); // [2] (static)
Companion$.MODULE$.hello(); // [3] (static)
}
}




Multiline String és Beágyazott XML
val someXMLInAString = """
<sammich>
<bread>wheat</bread>
<meat>salami</meat>
<condiments>
<condiment expired="true">mayo</condiment>
<condiment expired="false">mustard</condiment>
</condiments>
</sammich>
"""
import scala.xml._
val someXML =
<sammich>
<bread>wheat</bread>
<meat>salami</meat>
<condiments>
<condiment expired="true">mayo</condiment>
<condiment expired="false">mustard</condiment>
</condiments>
</sammich>



Információk
http://www.scala-lang.org/
https://www.coursera.org/course/progfun
http://blog.knoldus.com
http://java.dzone.com/taxonomy/term/277/0
http://www.scala-lang.
org/docu/files/ScalaByExample.pdf
http://www.slideshare.net/tpunder/a-briefintro-to-scala
http://cscarioni.blogspot.ie/2013/02/ducktyping-in-scala-kind-of-structural.html



Köszönöm a
figyelmet
Elérhetőség:
janos.haber@finesolution.hu