Почему пора
использовать Scala
Почему именно Scala?
Почему именно Scala?
Ты забыл про этот слайд, импровизируй!
Простой POJO
public class User {
private String name;
private String email;
private DateTime registerDate;
}
Простой POJO
public User() {
}
public User(String name, String email,
DateTime registerDate) {
this.name = name;
this.email = email;
this.registerDate = registerDate;
}
Простой 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;
}
Простой 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;
}
Простой POJO
public 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;
}
}
Простой 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»)
Сопоставление с образцом
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;
}
}
Сопоставление с образцом
abstract class Homo
class HomoHabilis extends Homo
class HomoHeidelbergensis extends Homo
class HomoSapiens extends Homo
def evolve(homo: Homo) {
homo match {
case habilis: HomoHabilis => //die
case heidelbergensis: HomoHeidelbergensis => //die
case sapiens: HomoSapiens => //love scala ^__^
}
}
На вкусное
• любое выражение возвращает результат
• генераторы циклов + результат в виде списка
• парсер-комбинаторы
• xml на уровне синтаксиса языка
• null-safe (за использование null бьют ногой в лицо)
• легко строить DSL
• () и ; не нужны!
• функцию можно вызвать без точки
• == работает как equals
• один файл != одном класс
Немного магии
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(_))
}
}
Минусы
• часть библиотек забагованы
• нет совместимости байткода между версиями языка
• часть исходников невозможно читать. Совсем.
• неявные преобразования(implicit)
• как-бэ совместимость с Java
• своя рефлексия
• медленный компилятор
• у sbt свои тараканы
• Scala плагин для Idea тупит и тормозит
• «дружелюбное" комьюнити
Спасибо
Борис Ташкулов
boris.tashkulov@dz.ru
@crashkin

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

  • 1.
  • 2.
  • 3.
    Почему именно Scala? Тызабыл про этот слайд, импровизируй!
  • 4.
    Простой POJO public classUser { private String name; private String email; private DateTime registerDate; }
  • 5.
    Простой POJO public User(){ } public User(String name, String email, DateTime registerDate) { this.name = name; this.email = email; this.registerDate = registerDate; }
  • 6.
    Простой POJO public StringgetName() { 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; }
  • 7.
    Простой POJO @Override public booleanequals(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; }
  • 8.
    Простой POJO public classUser { 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; } }
  • 9.
    Простой case class caseclass 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»)
  • 10.
    Сопоставление с образцом publicabstract 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; } }
  • 11.
    Сопоставление с образцом abstractclass Homo class HomoHabilis extends Homo class HomoHeidelbergensis extends Homo class HomoSapiens extends Homo def evolve(homo: Homo) { homo match { case habilis: HomoHabilis => //die case heidelbergensis: HomoHeidelbergensis => //die case sapiens: HomoSapiens => //love scala ^__^ } }
  • 12.
    На вкусное • любоевыражение возвращает результат • генераторы циклов + результат в виде списка • парсер-комбинаторы • xml на уровне синтаксиса языка • null-safe (за использование null бьют ногой в лицо) • легко строить DSL • () и ; не нужны! • функцию можно вызвать без точки • == работает как equals • один файл != одном класс
  • 13.
    Немного магии 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(_)) } }
  • 14.
    Минусы • часть библиотекзабагованы • нет совместимости байткода между версиями языка • часть исходников невозможно читать. Совсем. • неявные преобразования(implicit) • как-бэ совместимость с Java • своя рефлексия • медленный компилятор • у sbt свои тараканы • Scala плагин для Idea тупит и тормозит • «дружелюбное" комьюнити
  • 15.