[Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему...
-
Upload
provectus -
Category
Technology
-
view
65 -
download
0
Transcript of [Expert Fridays] Java MeetUp - Борис Ташкулов (Teamlead Enterprise): "Почему...
Почему пора использовать
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; }
Простой 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; }}
Простой 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 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 ^__^ }}
На вкусное
• любое выражение возвращает результат• генераторы циклов + результат в виде списка• парсер-комбинаторы• 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 тупит и тормозит• «дружелюбное" комьюнити