[expert fridays] java meetup - Борис Ташкулов (teamlead enterprise): "Почему...

15
Почему пора использовать Scala

Upload: provectus

Post on 15-Apr-2017

65 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Почему пора использовать

Scala

Page 2: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Почему именно Scala?

Page 3: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Почему именно Scala?

Ты забыл про этот слайд, импровизируй!

Page 4: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой POJO

public class User {

private String name; private String email; private DateTime registerDate;

}

Page 5: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой POJO

public User() { }

public User(String name, String email, DateTime registerDate) { this.name = name; this.email = email; this.registerDate = registerDate; }

Page 6: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой POJO public String getName() { return name; }

public void setName(String name) { this.name = name; }

public String getEmail() { return email; }

public void setEmail(String email) { this.email = email; }

public DateTime getRegisterDate() { return registerDate; }

public void setRegisterDate(DateTime registerDate) { this.registerDate = registerDate; }

Page 7: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой POJO

@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

if (name != null ? !name.equals(user.name) : user.name != null) return false; if (email != null ? !email.equals(user.email) : user.email != null) return false; return registerDate != null ? registerDate.equals(user.registerDate) : user.registerDate == null;

}

@Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (email != null ? email.hashCode() : 0); result = 31 * result + (registerDate != null ? registerDate.hashCode() : 0); return result; }

Page 8: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой POJOpublic class User {

private String name; private String email; private DateTime registerDate;

public User() { }

public User(String name, String email, DateTime registerDate) { this.name = name; this.email = email; this.registerDate = registerDate; }

public String getName() { return name; }

public void setName(String name) { this.name = name; }

public String getEmail() { return email; }

public void setEmail(String email) { this.email = email; }

public DateTime getRegisterDate() { return registerDate; }

public void setRegisterDate(DateTime registerDate) { this.registerDate = registerDate; }

@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false;

User user = (User) o;

if (name != null ? !name.equals(user.name) : user.name != null) return false; if (email != null ? !email.equals(user.email) : user.email != null) return false; return registerDate != null ? registerDate.equals(user.registerDate) : user.registerDate == null;

}

@Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (email != null ? email.hashCode() : 0); result = 31 * result + (registerDate != null ? registerDate.hashCode() : 0); return result; }}

Page 9: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Простой case class

case class User(name: String, email: String, registerDate: DateTime = DateTime.now)

val obj1 = User(«Some name», «Some email»)

val obj2 = obj1.copy()

val obj3 = obj1.copy(name = «New name»)

Page 10: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Сопоставление с образцом

public abstract class Homo

pubic class HomoHabilis extends Homo {}public class HomoHeidelbergensis extends Homo {}public class HomoSapiens extends Homo {}

public void evolve(Homo homo) { if (homo instanceof HomoHabilis) { HomoHabilis h = (HomoHabilis) homo //die return; } if (homo instanceof HomoHeidelbergensis) { //cast //die return; } if (homo instanceof HomoSapiens) { //cast //evolve return; }}

Page 11: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Сопоставление с образцом

abstract class Homo

class HomoHabilis extends Homoclass HomoHeidelbergensis extends Homoclass HomoSapiens extends Homo

def evolve(homo: Homo) { homo match { case habilis: HomoHabilis => //die case heidelbergensis: HomoHeidelbergensis => //die case sapiens: HomoSapiens => //love scala ^__^ }}

Page 12: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

На вкусное

• любое выражение возвращает результат• генераторы циклов + результат в виде списка• парсер-комбинаторы• xml на уровне синтаксиса языка• null-safe (за использование null бьют ногой в лицо)• легко строить DSL• () и ; не нужны!• функцию можно вызвать без точки• == работает как equals• один файл != одном класс

Page 13: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Немного магииval xml = <root> <first> <action> <name>Say</name> <value>Hello</value> </action> <action> <name>Don't say</name> <value>Goodbye</value> </action> </first> <first> <action> <name>Love</name> <value>Scala</value> </action> <action> <name>Use</name> <value>FP</value> </action> </first></root>

object XmlParserApp {

case class MyAction(name: String, value: String)

def main(args: Array[String]): Unit = { val result = for {firstEl <- xml \ "first" actionEl <- firstEl \ "action"} yield { MyAction( name = (actionEl \ "name").text, value = (actionEl \ "value").text ) }

result.foreach(println(_)) } }

Page 14: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Минусы

• часть библиотек забагованы• нет совместимости байткода между версиями языка• часть исходников невозможно читать. Совсем.• неявные преобразования(implicit)• как-бэ совместимость с Java• своя рефлексия• медленный компилятор• у sbt свои тараканы• Scala плагин для Idea тупит и тормозит• «дружелюбное" комьюнити

Page 15: [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему пора использовать Scala"

Спасибо

Борис Ташкулов[email protected]

@crashkin