SlideShare a Scribd company logo
Почему пора
использовать 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

More Related Content

Viewers also liked

Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum
 
Intro to kotlin
Intro to kotlinIntro to kotlin
Intro to kotlin
Tomislav Homan
 
Do Languages Matter?
Do Languages Matter?Do Languages Matter?
Do Languages Matter?
Bruce Eckel
 
Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?
DotNetConf
 
Programming in scala - 1
Programming in scala - 1Programming in scala - 1
Programming in scala - 1
Mukesh Kumar
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
Bartosz Kosarzycki
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
Leonardo Zanivan
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
 
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart CastsTMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
Iosif Itkin
 
ACP April End of School Year Newsletter SP_2011
ACP April End of School Year Newsletter SP_2011ACP April End of School Year Newsletter SP_2011
ACP April End of School Year Newsletter SP_2011
Jennifer Clemente
 
Museum and gallery events
Museum and gallery eventsMuseum and gallery events
Museum and gallery events
smellybottlenec93
 
Alyssa S.N Mason - Renovations
Alyssa S.N Mason - RenovationsAlyssa S.N Mason - Renovations
Alyssa S.N Mason - RenovationsJonathan Mohabir
 
Social@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina AgendaSocial@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina AgendaJennifer Clemente
 
Backbone js for expert fridays.pptx
Backbone js for  expert fridays.pptxBackbone js for  expert fridays.pptx
Backbone js for expert fridays.pptx
Provectus
 

Viewers also liked (16)

Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using Kotlin
 
Intro to kotlin
Intro to kotlinIntro to kotlin
Intro to kotlin
 
Do Languages Matter?
Do Languages Matter?Do Languages Matter?
Do Languages Matter?
 
Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?
 
Programming in scala - 1
Programming in scala - 1Programming in scala - 1
Programming in scala - 1
 
Kotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developersKotlin advanced - language reference for android developers
Kotlin advanced - language reference for android developers
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
 
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
 
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart CastsTMPA-2015: Kotlin: From Null Dereference to Smart Casts
TMPA-2015: Kotlin: From Null Dereference to Smart Casts
 
ACP April End of School Year Newsletter SP_2011
ACP April End of School Year Newsletter SP_2011ACP April End of School Year Newsletter SP_2011
ACP April End of School Year Newsletter SP_2011
 
Museum and gallery events
Museum and gallery eventsMuseum and gallery events
Museum and gallery events
 
Alyssa S.N Mason - Renovations
Alyssa S.N Mason - RenovationsAlyssa S.N Mason - Renovations
Alyssa S.N Mason - Renovations
 
Unix 5 en
Unix 5 enUnix 5 en
Unix 5 en
 
Social@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina AgendaSocial@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina Agenda
 
Erika Gonzalez
Erika GonzalezErika Gonzalez
Erika Gonzalez
 
Backbone js for expert fridays.pptx
Backbone js for  expert fridays.pptxBackbone js for  expert fridays.pptx
Backbone js for expert fridays.pptx
 

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

Xtend
XtendXtend
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуAndreyGeonya
 
Kotlin
KotlinKotlin
Kotlin
GDG Odessa
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для Android
Kirill Rozov
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
Vasil Remeniuk
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
Ruslan Balkin
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
Infinity
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
chashnikov
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
Igor Shkulipa
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
AndreyGeonya
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3 phpclub
 
Как писать под Android программы, а не код
Как писать под Android программы, а не кодКак писать под Android программы, а не код
Как писать под Android программы, а не код
0leGG
 
Интерфейсы
ИнтерфейсыИнтерфейсы
ИнтерфейсыREX-MDK
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияYandex
 
наследование
наследованиенаследование
наследованиеmary110190
 

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

Xtend
XtendXtend
Xtend
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 
Kotlin
KotlinKotlin
Kotlin
 
Kotlin для Android
Kotlin для AndroidKotlin для Android
Kotlin для Android
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Groovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всёмGroovy и Grails. Быстро и обо всём
Groovy и Grails. Быстро и обо всём
 
Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
C# Desktop. Занятие 03.
C# Desktop. Занятие 03.C# Desktop. Занятие 03.
C# Desktop. Занятие 03.
 
Принципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.DПринципы проектирования S.O.L.I.D
Принципы проектирования S.O.L.I.D
 
Что нового в PHP-5.3
Что нового в PHP-5.3 Что нового в PHP-5.3
Что нового в PHP-5.3
 
Как писать под Android программы, а не код
Как писать под Android программы, а не кодКак писать под Android программы, а не код
Как писать под Android программы, а не код
 
Интерфейсы
ИнтерфейсыИнтерфейсы
Интерфейсы
 
Михаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знанияМихаил Давыдов — JavaScript: Базовые знания
Михаил Давыдов — JavaScript: Базовые знания
 
наследование
наследованиенаследование
наследование
 

More from Provectus

Choosing the right IDP Solution
Choosing the right IDP SolutionChoosing the right IDP Solution
Choosing the right IDP Solution
Provectus
 
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Provectus
 
Choosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare OrganizationsChoosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare Organizations
Provectus
 
MLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in ProductionMLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in Production
Provectus
 
AI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and BeyondAI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and Beyond
Provectus
 
Feature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine LearningFeature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine Learning
Provectus
 
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMakerMLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
Provectus
 
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMRCost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Provectus
 
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
Provectus
 
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K..."Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
Provectus
 
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ..."How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
Provectus
 
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky..."Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
Provectus
 
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2..."Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
Provectus
 
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma..."Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
Provectus
 
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ..."Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
Provectus
 
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
Provectus
 
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
Provectus
 
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti..."Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
Provectus
 
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
Provectus
 
How to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAMHow to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAM
Provectus
 

More from Provectus (20)

Choosing the right IDP Solution
Choosing the right IDP SolutionChoosing the right IDP Solution
Choosing the right IDP Solution
 
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
 
Choosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare OrganizationsChoosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare Organizations
 
MLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in ProductionMLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in Production
 
AI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and BeyondAI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and Beyond
 
Feature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine LearningFeature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine Learning
 
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMakerMLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
 
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMRCost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
 
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
 
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K..."Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
 
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ..."How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
 
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky..."Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
 
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2..."Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
 
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma..."Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
 
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ..."Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
 
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
 
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
 
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti..."Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
 
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
 
How to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAMHow to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAM
 

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

  • 3. Почему именно Scala? Ты забыл про этот слайд, импровизируй!
  • 4. Простой POJO public class User { 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 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; }
  • 7. Простой 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; }
  • 8. Простой 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; } }
  • 9. Простой 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»)
  • 10. Сопоставление с образцом 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; } }
  • 11. Сопоставление с образцом 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 ^__^ } }
  • 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 тупит и тормозит • «дружелюбное" комьюнити