KEMBAR78
Scala == Effective Java | PPTX
Clean Code ScalaScala == Effective Java ?
„Leave camp cleaner than you found it.”Uncle Bob
Why do we write bad code ???Rush (duck tape programmer)LazinessCarelessWe don’t know how good code looks likeLack of resourcesWe like to do new things (create)
„Its harder to read the code than to write it”Joel Spolsky
How to improve work quality ?Dont give developers money rewardsbigger reward == worse performanceLet them work on what they like and how they like (Google, Atlassian, Facebook)Allow and encourage self improvement
Java dev librariesGoogle GuavaApache CommonsSpringGuiceScala !
Why Scala ?More conciseMore powerfullFun!FastBecoming popular !
Who uses Scala already
Class Parameters - Javapublicclass Person {	private String name;	privateintage;publicPerson(String name, int age) {		this.name = name;		this.age = age;	}	public String getName() {		returnname;	}	publicvoid setName(String name) {		this.name = name;	}	publicint getAge() {		returnage;	}	publicvoid setAge(int age) {		this.age = age;	}}
Class Parameters - ScalaclassPerson(var name: String, var age: Int)
publicclass Person {private String name;privateintage;public Person(String name, int age) {this.name = name;this.age = age;	}public String getName() {returnname;	}publicvoidsetName(String name) {this.name = name;	}publicintgetAge() {returnage;	}publicvoidsetAge(int age) {this.age = age;	}@Overridepublic String toString() {returnString.format("Person: %s age: %s", name, age);	}@OverridepublicinthashCode() {inthashCode = 0;for(char c: name.toCharArray()) {hashCode += c;		}return 11 * hashCode + age; 	}@Overridepublicboolean equals(Object other) {if(other == null) returnfalse;if(other instanceof Person) {			Person person = (Person)other;returnperson.name.equals(name) && person.age == age;}returnfalse;	}
Scala case classcaseclass Person(name: String, age: Int)Dostajemy za darmo: equals(), hashCode() oraz toString() oraz niezmienną klasę (immutable).
To equal or not to equal ? 		Person p = new Person("Jan Kowalski", 30);		Set<Person> set = new HashSet<Person>();		set.add(p);		System.out.println(set.contains(p)); // truep.setAge(p.getAge()+1);System.out.println(set.contains(p)); // false		... WTF ???
To equal or not to equal ?Iterator<Person> it = set.iterator();booleancontainedP = false;while (it.hasNext()) {		    Person nextP = it.next();if (nextP.equals(p)) {containedP = true;break;		    }		}System.out.println(containedP); // true 		// ... ???
Scala Case ClassclassPerson(val name: String, val age: Int)objectPerson {def apply(name: String, age: Int) = newPerson(name, age)// defhashCode(): Int// deftoString(): String// def equals(other: Object): Booleandefunapply(p: Person): Option[(String, Int)]=Some(p.name, p.age) }Extractorcase
Java – working with PersonObject x = new Person("Bill Clinton", 64);if(x instanceof Person) {	Person p = (Person)x;	System.out.println(„Person name: "+p.getName());} else {	System.out.println("Not a person");}x = "Lukasz Kuczera";if(x instanceof Person) {	Person p = (Person)x;	System.out.println("hello "+p.getName());} elseif(x instanceof String) {	String s = (String)x;if(s.equals("Bill Clinton")) 		System.out.println("Hello Bill");else System.out.println("hello: "+s);} else System.out.println("err, ???");
Scala – Pattern Matchingvar x: Any = Person("Lukasz", 28);	x match {case Person(name, age) => println("Person name: "+name);case _ => println("Not a person")}	x = "Lukasz Kuczera"	x match {case Person(name, age) => println("Person name: "+name)case"Bill Clinton" => println("hello Bill")case s: String => println("hello "+s)case _ => "err, ???"	}Person name: Lukaszhello Lukasz Kuczera
Parameter validationpublicclass Person {	private String name;	privateintage;publicPerson(String name, int age) {if(name == null) {thrownew NullPointerException();}if(age < 0) {thrownew IllegalArgumentException("Age < 0")}		this.name = name;		this.age = age;	}
Parameter validationcaseclass Person(name: String, age: Int) {// @elidable(ASSERTION)assert(age > 0, "Age < 0")// by name parameter}
Working with arraysJavapublicclass Partition {Person[] all;Person[] adults;Person[] minors;	 { ArrayList<Person> minorsList = new ArrayList<Person>();ArrayList<Person> adultsList = new ArrayList<Person>();for(int i=0; i<all.length; i++ ) {	(all[i].age<18 ? adultsList: minorsList).add(all[i]);	 	}		minors = (Person[]) minorsList.toArray();		adults = (Person[]) adultsList.toArray();}}
Working with arraysScalaval all: Array[Person]val (minors, adults) = all.partition(_.age<18)
Null’s – JavaMap<String, String> capitals = new HashMap<String, String>();capitals.put("Poland", "Warsaw");System.out.println(capitals.get("Polska").trim());Exception in thread "main" java.lang.NullPointerException
Null’s - Scala  val capitals = Map("Poland" -> "Warsaw");val capitalOption: Option[String] = capitals.get("Polska")  capitalOption match {case Some(value) => println(value)case None => println("Not found")case _ =>  }if(capitalOption.isDefined) println(capitalOption.get)  println(capitalOption getOrElse "Not found")
Scala IO == Java + Commons IOvallines = Source.fromFile("d:\\scala\\MobyDick.txt").getLines;valwithNumbers = lines.foldLeft(List(""))((l,s) => (s.length+" "+s)::l)println(withNumbers.mkString("\n"))withNumbers.foreach(println)withNumbers.filter(!_.startsWith("0")).map(_.toUpperCase).sort(_.length < _.length).foreach(println)
Scala DI - Cake PatterntraitPersonService {deffindByAge(age: Int): Person} traitPersonServiceImplextendsPersonService {deffindByAge(age: Int): Person = new Person("", 12) }  traitPersonDAO {defgetAll(): Seq[Person]} traitPersonDAOImplextendsPersonDAO {defgetAll(): Seq[Person] = List(new Person("", 12))}
Scala DI - Cake PatterntraitDirectory {	self: PersonServicewithPersonDAO =>} classDirectoryComponentextends Directory withPersonServiceImplwithPersonDAOImpl {}
GuiceMinimize mutabilityAvoid static state@Nullable

Scala == Effective Java

  • 1.
    Clean Code ScalaScala== Effective Java ?
  • 5.
    „Leave camp cleanerthan you found it.”Uncle Bob
  • 7.
    Why do wewrite bad code ???Rush (duck tape programmer)LazinessCarelessWe don’t know how good code looks likeLack of resourcesWe like to do new things (create)
  • 8.
    „Its harder toread the code than to write it”Joel Spolsky
  • 9.
    How to improvework quality ?Dont give developers money rewardsbigger reward == worse performanceLet them work on what they like and how they like (Google, Atlassian, Facebook)Allow and encourage self improvement
  • 10.
    Java dev librariesGoogleGuavaApache CommonsSpringGuiceScala !
  • 11.
    Why Scala ?MoreconciseMore powerfullFun!FastBecoming popular !
  • 12.
  • 13.
    Class Parameters -Javapublicclass Person { private String name; privateintage;publicPerson(String name, int age) { this.name = name; this.age = age; } public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(int age) { this.age = age; }}
  • 14.
    Class Parameters -ScalaclassPerson(var name: String, var age: Int)
  • 15.
    publicclass Person {privateString name;privateintage;public Person(String name, int age) {this.name = name;this.age = age; }public String getName() {returnname; }publicvoidsetName(String name) {this.name = name; }publicintgetAge() {returnage; }publicvoidsetAge(int age) {this.age = age; }@Overridepublic String toString() {returnString.format("Person: %s age: %s", name, age); }@OverridepublicinthashCode() {inthashCode = 0;for(char c: name.toCharArray()) {hashCode += c; }return 11 * hashCode + age; }@Overridepublicboolean equals(Object other) {if(other == null) returnfalse;if(other instanceof Person) { Person person = (Person)other;returnperson.name.equals(name) && person.age == age;}returnfalse; }
  • 16.
    Scala case classcaseclassPerson(name: String, age: Int)Dostajemy za darmo: equals(), hashCode() oraz toString() oraz niezmienną klasę (immutable).
  • 17.
    To equal ornot to equal ?  Person p = new Person("Jan Kowalski", 30); Set<Person> set = new HashSet<Person>(); set.add(p); System.out.println(set.contains(p)); // truep.setAge(p.getAge()+1);System.out.println(set.contains(p)); // false ... WTF ???
  • 18.
    To equal ornot to equal ?Iterator<Person> it = set.iterator();booleancontainedP = false;while (it.hasNext()) { Person nextP = it.next();if (nextP.equals(p)) {containedP = true;break; } }System.out.println(containedP); // true // ... ???
  • 19.
    Scala Case ClassclassPerson(valname: String, val age: Int)objectPerson {def apply(name: String, age: Int) = newPerson(name, age)// defhashCode(): Int// deftoString(): String// def equals(other: Object): Booleandefunapply(p: Person): Option[(String, Int)]=Some(p.name, p.age) }Extractorcase
  • 20.
    Java – workingwith PersonObject x = new Person("Bill Clinton", 64);if(x instanceof Person) { Person p = (Person)x; System.out.println(„Person name: "+p.getName());} else { System.out.println("Not a person");}x = "Lukasz Kuczera";if(x instanceof Person) { Person p = (Person)x; System.out.println("hello "+p.getName());} elseif(x instanceof String) { String s = (String)x;if(s.equals("Bill Clinton")) System.out.println("Hello Bill");else System.out.println("hello: "+s);} else System.out.println("err, ???");
  • 21.
    Scala – PatternMatchingvar x: Any = Person("Lukasz", 28); x match {case Person(name, age) => println("Person name: "+name);case _ => println("Not a person")} x = "Lukasz Kuczera" x match {case Person(name, age) => println("Person name: "+name)case"Bill Clinton" => println("hello Bill")case s: String => println("hello "+s)case _ => "err, ???" }Person name: Lukaszhello Lukasz Kuczera
  • 22.
    Parameter validationpublicclass Person{ private String name; privateintage;publicPerson(String name, int age) {if(name == null) {thrownew NullPointerException();}if(age < 0) {thrownew IllegalArgumentException("Age < 0")} this.name = name; this.age = age; }
  • 23.
    Parameter validationcaseclass Person(name:String, age: Int) {// @elidable(ASSERTION)assert(age > 0, "Age < 0")// by name parameter}
  • 24.
    Working with arraysJavapublicclassPartition {Person[] all;Person[] adults;Person[] minors; { ArrayList<Person> minorsList = new ArrayList<Person>();ArrayList<Person> adultsList = new ArrayList<Person>();for(int i=0; i<all.length; i++ ) { (all[i].age<18 ? adultsList: minorsList).add(all[i]); } minors = (Person[]) minorsList.toArray(); adults = (Person[]) adultsList.toArray();}}
  • 25.
    Working with arraysScalavalall: Array[Person]val (minors, adults) = all.partition(_.age<18)
  • 26.
    Null’s – JavaMap<String,String> capitals = new HashMap<String, String>();capitals.put("Poland", "Warsaw");System.out.println(capitals.get("Polska").trim());Exception in thread "main" java.lang.NullPointerException
  • 27.
    Null’s - Scala val capitals = Map("Poland" -> "Warsaw");val capitalOption: Option[String] = capitals.get("Polska") capitalOption match {case Some(value) => println(value)case None => println("Not found")case _ => }if(capitalOption.isDefined) println(capitalOption.get) println(capitalOption getOrElse "Not found")
  • 28.
    Scala IO ==Java + Commons IOvallines = Source.fromFile("d:\\scala\\MobyDick.txt").getLines;valwithNumbers = lines.foldLeft(List(""))((l,s) => (s.length+" "+s)::l)println(withNumbers.mkString("\n"))withNumbers.foreach(println)withNumbers.filter(!_.startsWith("0")).map(_.toUpperCase).sort(_.length < _.length).foreach(println)
  • 29.
    Scala DI -Cake PatterntraitPersonService {deffindByAge(age: Int): Person} traitPersonServiceImplextendsPersonService {deffindByAge(age: Int): Person = new Person("", 12) }  traitPersonDAO {defgetAll(): Seq[Person]} traitPersonDAOImplextendsPersonDAO {defgetAll(): Seq[Person] = List(new Person("", 12))}
  • 30.
    Scala DI -Cake PatterntraitDirectory { self: PersonServicewithPersonDAO =>} classDirectoryComponentextends Directory withPersonServiceImplwithPersonDAOImpl {}
  • 31.