SlideShare a Scribd company logo
Why Scala is the better Java
Thomas Kaiser
Technologieplauscherl
14.01.2016
Agenda
• Why this talk
• Cool language features
• Pitfalls and how to avoid them
• Resources
Quick survey
• Who...
• ... Writes Java code for production?
• ... Has ever written any Scala code?
• ... Has ever written Scala for production?
• Me
• Java background (Spring, Hibernate, Grails, GWT, Android)
• Scala webapp w/ Postgres, Mongo, Play, Angular, REST
What is Scala
• JVM based functional/OO language
• Powerful type system
• Traits/mixins
• Higher-order functions
• Pattern matching
• Concurrency abstractions
Why this talk
• People are interested in Scala, but also afraid?
• Scala is extremely powerful and flexible
• Syntax
• Huge library
• Lots of ways to do the same thing
• Very intimidating type system
• BUT! You don‘t have to use any of the advanced features and still
benefit massively
Why Scala
• Extremely expressive (LOC--)
• Static typing
• Very clean style comes built-in
• Awesome (awesome) library (collections etc)
• Writing Scala code is actually fun!
Language features (why I love Scala)
• Tuples
• String concatenation
• Local functions
• Import aliases
• Super-easy collection/map creation
• Powerful collections library
• Traits
• Case classes
• Pattern matching
• Function values/function literals
• Multiple parameter lists
• Option[T]
• For-Comprehensions
• Everything is a value
• Syntax flexibility
• Type inference
• JSON/XML handling
• Scalatest/specs2
• Implicit conversions
• Annymous/structural types, type aliases
• Algebraic data types
S vs. J: Boilerplate
public class User {
private String name;
private List<Order> orders;
public User() {
orders = new ArrayList<Order>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order>
orders) {
this.orders = orders;
}
}
public class Order {
private int id;
private List<Product> products;
public Order() {
products = new ArrayList<Product>();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product>
products) {
this.products = products;
}
}
public class Product {
private int id;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String
category) {
this.category = category;
}
}
S vs. J: Boilerplate
case class User(name: String, orders: List[Order])
case class Order(id: Int, products: List[Product])
case class Product(id: Int, category: String)
S vs. J: Standard use case – extract data
• Get products of a User
public class User {
...
public List<Product> getProducts() {
List<Product> products = new ArrayList<Product>();
for (Order order : orders) {
products.addAll(order.getProducts());
}
return products;
}
}
S vs. J: Standard use case – extract data
• Get ordered products of a User
def products = orders.flatMap(o => o.products)
S vs. J: Remove x highest values
public static List<Integer> removeHighestValuesJ6(
List<Integer> values, int amount) {
List<Integer> localValues = new ArrayList<>(values);
Collections.sort(localValues);
int toIndex = localValues.size() - amount;
if (toIndex < 0) {
toIndex = 0;
}
return localValues.subList(0, toIndex);
}
public static List<Integer> removeHighestValuesJ8(
List<Integer> values, int amount) {
Collections.sort(values); // in-place! boo!
Collections.reverse(values); // in-place!
List<Integer> result = values.stream()
.skip(amount)
.collect(Collectors.toList());
return result;
}
S vs. J: Remove x highest values
def removeHighestValues(list: List[Int], amount: Int) = {
list.sorted.reverse.drop(amount)
}
For comprehensions each++
for (i <- 1 to 7) print(i) // 1234567
for (i <- 1 to 7 if i % 2 == 0) print(i) // 246
case class Person(age: Int)
val persons =
for (i <- 20 to 35 by 5) yield Person(i)
// Person(20), Person(25), Person(30), Person(35)
Pattern matching
case class Person(name: String, age: Int)
val p1 = Person("thomas", 29)
val p2 = Person("dominik", 32)
p2 match {
case Person("thomas", 29) => "exactly that person"
case Person(_, age) if age > 30 => "anyone over 30"
case p : Person => s"just binding to a variable (${p.name})"
}
Pattern matching
val list = List(1, 2, 3)
list match {
case 1 :: 2 :: rest => "list starts with 1,2 and has " + rest.length + " more"
}
Everything is a value
val bool = true
val yepNope = if (bool) "yep" else "nope"
case class AuthUser(email: String, roles: Set[String])
val currentUser = AuthUser(”user", Set("ADMIN"))
val isAuthorized = currentUser match {
case AuthUser(_, roles) if roles.contains("ADMIN") => true
case _ => false
}
Everything is a value
def russianRoulette() =
if (Random.nextInt(6) == 0)
throw new RuntimeException(“bang“)
else
"phew“
val dangerousResult: String =
try {
russianRoulette()
} catch {
case RuntimeException => "dead :(“
}
Implicit conversions
val hello: String = "hello"
hello.emphasize // Error:(32, 8) value emphasize is not a member of String
„Pimp my library pattern“
implicit class PimpedString(base: String) {
def emphasize = base + "!!!11"
}
import PimpedString
val pimpedString = hello.emphasize // hello!!!11
Implicit conversions
for (i <- 1 to 7) <=> 1.to(7) <=> val r: Range = new RichInt(1).to(7)
DSLs
class HelloWorldSpec extends Specification {
"Hello world" should {
val hw = "Hello world"
“be 11 chars long" in {
hw should have size 11
}
"start with hello" in {
hw should startWith "hello“
}
}
}
DSLs
"show off some mocking DSL" in {
val m = mock[List[String]]
m.get(0) returns “0"
// .. code under test ...
there was one(m).get(0)
}
DSLs
val messageFlow =
filter { payload: String => payload == "World" }
-->
transform { payload: String => "Hello " + payload }
-->
handle { payload: String => println(payload) }
messageFlow.send("World") // "Hello World"
Implicit conversions
for (i <- 1 to 7) <=> 1.to(7) <=> val r: Range = new RichInt(1).to(7)
Map(1 -> "one") <=> 1.->("one") <=> val entry : (Int, String) = new ArrowAssoc[Int](1).->("one”)
val x = Future { ... }
Await.result(x, 5 seconds) <=> new DurationInt(5)
Pitfalls
• Implicits can be confusing
• Many different codestyles in the wild
• Hard to understand libraries
• Yet another build tool (SBT)
Take away
• Just do it!
• You can always go back or mix Java and Scala code
• ... But you won‘t
• Be wary of advanced language features
• Don‘t be scared, you don‘t have to use anything
• Use it as a very expressive, fun, supercharged Java
• ... And you won‘t look back
• „Scalable language“
Resources
• http://scala-lang.org/
• http://docs.scala-lang.org/cheatsheets/
• List of links (!!)
• Learning functional programming without growing a neckbeard
• https://github.com/pocorall/scaloid (Scala4Android, super cool)

More Related Content

PDF
Scala - en bedre og mere effektiv Java?
PDF
The Ring programming language version 1.5.1 book - Part 34 of 180
PDF
The Ring programming language version 1.7 book - Part 39 of 196
PDF
Scala - en bedre Java?
PDF
여자개발자모임터 6주년 개발 세미나 - Scala Language
PDF
Scala vs Java 8 in a Java 8 World
PDF
Scala in Places API
PDF
The Ring programming language version 1.5 book - Part 3 of 31
Scala - en bedre og mere effektiv Java?
The Ring programming language version 1.5.1 book - Part 34 of 180
The Ring programming language version 1.7 book - Part 39 of 196
Scala - en bedre Java?
여자개발자모임터 6주년 개발 세미나 - Scala Language
Scala vs Java 8 in a Java 8 World
Scala in Places API
The Ring programming language version 1.5 book - Part 3 of 31

What's hot (17)

ODP
1.2 scala basics
PDF
The Ring programming language version 1.5.2 book - Part 14 of 181
PPTX
All about scala
PDF
The Ring programming language version 1.8 book - Part 41 of 202
PDF
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
PDF
Scala jeff
PPTX
Scala on Android
PDF
Ruby Language - A quick tour
PDF
The Ring programming language version 1.2 book - Part 24 of 84
PDF
Introduction to-scala
PDF
Pragmatic Real-World Scala (short version)
PPT
Scala introduction
PDF
High Wizardry in the Land of Scala
PDF
Introduction to Scala
PDF
A bit about Scala
PDF
Scala vs java 8
PDF
Introduction aux Macros
1.2 scala basics
The Ring programming language version 1.5.2 book - Part 14 of 181
All about scala
The Ring programming language version 1.8 book - Part 41 of 202
JDays Lviv 2014: Java8 vs Scala: Difference points & innovation stream
Scala jeff
Scala on Android
Ruby Language - A quick tour
The Ring programming language version 1.2 book - Part 24 of 84
Introduction to-scala
Pragmatic Real-World Scala (short version)
Scala introduction
High Wizardry in the Land of Scala
Introduction to Scala
A bit about Scala
Scala vs java 8
Introduction aux Macros
Ad

Viewers also liked (14)

PDF
Meenakshi Article Feb 2016 Chartered Secretary Issue
PDF
Prog i encuentromovimiento
PDF
Folleto marzo 2016
PDF
Circular glorr campaña recollida de roupa familias setembro 2016
DOCX
Proyecto 2
DOCX
PROYECTO 1
ODP
Día del joven
DOCX
Nós tamén creamos
PPTX
Nuevas siete maravillas del mundo moderno
PDF
Folla de inscrición no concurso logotipo
PDF
Xornadas Educación para o Desenvolvemento e Cidadanía Global
PDF
Süreç Yönetimi
DOCX
το πιο γλυκό ψωμί
DOCX
ιταλο καλβινο
Meenakshi Article Feb 2016 Chartered Secretary Issue
Prog i encuentromovimiento
Folleto marzo 2016
Circular glorr campaña recollida de roupa familias setembro 2016
Proyecto 2
PROYECTO 1
Día del joven
Nós tamén creamos
Nuevas siete maravillas del mundo moderno
Folla de inscrición no concurso logotipo
Xornadas Educación para o Desenvolvemento e Cidadanía Global
Süreç Yönetimi
το πιο γλυκό ψωμί
ιταλο καλβινο
Ad

Similar to Why Scala is the better Java (20)

PDF
An Introduction to Scala (2014)
PPTX
Hello kotlin | An Event by DSC Unideb
PPTX
PDF
Introduction to Scala
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
PDF
Scala @ TechMeetup Edinburgh
PPTX
Benefits of Kotlin
ODP
Scala introduction
PDF
Workshop Scala
PDF
The Ring programming language version 1.10 book - Part 47 of 212
ODP
Introduction to Scala
PDF
Kotlin: maybe it's the right time
PDF
(How) can we benefit from adopting scala?
PDF
Introduction to kotlin
PPTX
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
PDF
The Ring programming language version 1.5.4 book - Part 37 of 185
PDF
Kotlin Basics - Apalon Kotlin Sprint Part 2
An Introduction to Scala (2014)
Hello kotlin | An Event by DSC Unideb
Introduction to Scala
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
pragmaticrealworldscalajfokus2009-1233251076441384-2.pdf
Scala @ TechMeetup Edinburgh
Benefits of Kotlin
Scala introduction
Workshop Scala
The Ring programming language version 1.10 book - Part 47 of 212
Introduction to Scala
Kotlin: maybe it's the right time
(How) can we benefit from adopting scala?
Introduction to kotlin
Softshake 2013: 10 reasons why java developers are jealous of Scala developers
The Ring programming language version 1.5.4 book - Part 37 of 185
Kotlin Basics - Apalon Kotlin Sprint Part 2

Recently uploaded (20)

PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PPT
Introduction Database Management System for Course Database
PPTX
history of c programming in notes for students .pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
L1 - Introduction to python Backend.pptx
PDF
PTS Company Brochure 2025 (1).pdf.......
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
Understanding Forklifts - TECH EHS Solution
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Navsoft: AI-Powered Business Solutions & Custom Software Development
VVF-Customer-Presentation2025-Ver1.9.pptx
Introduction Database Management System for Course Database
history of c programming in notes for students .pptx
Upgrade and Innovation Strategies for SAP ERP Customers
Odoo Companies in India – Driving Business Transformation.pdf
L1 - Introduction to python Backend.pptx
PTS Company Brochure 2025 (1).pdf.......
Operating system designcfffgfgggggggvggggggggg
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
ManageIQ - Sprint 268 Review - Slide Deck
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
How Creative Agencies Leverage Project Management Software.pdf
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
Understanding Forklifts - TECH EHS Solution
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...

Why Scala is the better Java

  • 1. Why Scala is the better Java Thomas Kaiser Technologieplauscherl 14.01.2016
  • 2. Agenda • Why this talk • Cool language features • Pitfalls and how to avoid them • Resources
  • 3. Quick survey • Who... • ... Writes Java code for production? • ... Has ever written any Scala code? • ... Has ever written Scala for production? • Me • Java background (Spring, Hibernate, Grails, GWT, Android) • Scala webapp w/ Postgres, Mongo, Play, Angular, REST
  • 4. What is Scala • JVM based functional/OO language • Powerful type system • Traits/mixins • Higher-order functions • Pattern matching • Concurrency abstractions
  • 5. Why this talk • People are interested in Scala, but also afraid? • Scala is extremely powerful and flexible • Syntax • Huge library • Lots of ways to do the same thing • Very intimidating type system • BUT! You don‘t have to use any of the advanced features and still benefit massively
  • 6. Why Scala • Extremely expressive (LOC--) • Static typing • Very clean style comes built-in • Awesome (awesome) library (collections etc) • Writing Scala code is actually fun!
  • 7. Language features (why I love Scala) • Tuples • String concatenation • Local functions • Import aliases • Super-easy collection/map creation • Powerful collections library • Traits • Case classes • Pattern matching • Function values/function literals • Multiple parameter lists • Option[T] • For-Comprehensions • Everything is a value • Syntax flexibility • Type inference • JSON/XML handling • Scalatest/specs2 • Implicit conversions • Annymous/structural types, type aliases • Algebraic data types
  • 8. S vs. J: Boilerplate public class User { private String name; private List<Order> orders; public User() { orders = new ArrayList<Order>(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Order> getOrders() { return orders; } public void setOrders(List<Order> orders) { this.orders = orders; } } public class Order { private int id; private List<Product> products; public Order() { products = new ArrayList<Product>(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public List<Product> getProducts() { return products; } public void setProducts(List<Product> products) { this.products = products; } } public class Product { private int id; private String category; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } }
  • 9. S vs. J: Boilerplate case class User(name: String, orders: List[Order]) case class Order(id: Int, products: List[Product]) case class Product(id: Int, category: String)
  • 10. S vs. J: Standard use case – extract data • Get products of a User public class User { ... public List<Product> getProducts() { List<Product> products = new ArrayList<Product>(); for (Order order : orders) { products.addAll(order.getProducts()); } return products; } }
  • 11. S vs. J: Standard use case – extract data • Get ordered products of a User def products = orders.flatMap(o => o.products)
  • 12. S vs. J: Remove x highest values public static List<Integer> removeHighestValuesJ6( List<Integer> values, int amount) { List<Integer> localValues = new ArrayList<>(values); Collections.sort(localValues); int toIndex = localValues.size() - amount; if (toIndex < 0) { toIndex = 0; } return localValues.subList(0, toIndex); } public static List<Integer> removeHighestValuesJ8( List<Integer> values, int amount) { Collections.sort(values); // in-place! boo! Collections.reverse(values); // in-place! List<Integer> result = values.stream() .skip(amount) .collect(Collectors.toList()); return result; }
  • 13. S vs. J: Remove x highest values def removeHighestValues(list: List[Int], amount: Int) = { list.sorted.reverse.drop(amount) }
  • 14. For comprehensions each++ for (i <- 1 to 7) print(i) // 1234567 for (i <- 1 to 7 if i % 2 == 0) print(i) // 246 case class Person(age: Int) val persons = for (i <- 20 to 35 by 5) yield Person(i) // Person(20), Person(25), Person(30), Person(35)
  • 15. Pattern matching case class Person(name: String, age: Int) val p1 = Person("thomas", 29) val p2 = Person("dominik", 32) p2 match { case Person("thomas", 29) => "exactly that person" case Person(_, age) if age > 30 => "anyone over 30" case p : Person => s"just binding to a variable (${p.name})" }
  • 16. Pattern matching val list = List(1, 2, 3) list match { case 1 :: 2 :: rest => "list starts with 1,2 and has " + rest.length + " more" }
  • 17. Everything is a value val bool = true val yepNope = if (bool) "yep" else "nope" case class AuthUser(email: String, roles: Set[String]) val currentUser = AuthUser(”user", Set("ADMIN")) val isAuthorized = currentUser match { case AuthUser(_, roles) if roles.contains("ADMIN") => true case _ => false }
  • 18. Everything is a value def russianRoulette() = if (Random.nextInt(6) == 0) throw new RuntimeException(“bang“) else "phew“ val dangerousResult: String = try { russianRoulette() } catch { case RuntimeException => "dead :(“ }
  • 19. Implicit conversions val hello: String = "hello" hello.emphasize // Error:(32, 8) value emphasize is not a member of String „Pimp my library pattern“ implicit class PimpedString(base: String) { def emphasize = base + "!!!11" } import PimpedString val pimpedString = hello.emphasize // hello!!!11
  • 20. Implicit conversions for (i <- 1 to 7) <=> 1.to(7) <=> val r: Range = new RichInt(1).to(7)
  • 21. DSLs class HelloWorldSpec extends Specification { "Hello world" should { val hw = "Hello world" “be 11 chars long" in { hw should have size 11 } "start with hello" in { hw should startWith "hello“ } } }
  • 22. DSLs "show off some mocking DSL" in { val m = mock[List[String]] m.get(0) returns “0" // .. code under test ... there was one(m).get(0) }
  • 23. DSLs val messageFlow = filter { payload: String => payload == "World" } --> transform { payload: String => "Hello " + payload } --> handle { payload: String => println(payload) } messageFlow.send("World") // "Hello World"
  • 24. Implicit conversions for (i <- 1 to 7) <=> 1.to(7) <=> val r: Range = new RichInt(1).to(7) Map(1 -> "one") <=> 1.->("one") <=> val entry : (Int, String) = new ArrowAssoc[Int](1).->("one”) val x = Future { ... } Await.result(x, 5 seconds) <=> new DurationInt(5)
  • 25. Pitfalls • Implicits can be confusing • Many different codestyles in the wild • Hard to understand libraries • Yet another build tool (SBT)
  • 26. Take away • Just do it! • You can always go back or mix Java and Scala code • ... But you won‘t • Be wary of advanced language features • Don‘t be scared, you don‘t have to use anything • Use it as a very expressive, fun, supercharged Java • ... And you won‘t look back • „Scalable language“
  • 27. Resources • http://scala-lang.org/ • http://docs.scala-lang.org/cheatsheets/ • List of links (!!) • Learning functional programming without growing a neckbeard • https://github.com/pocorall/scaloid (Scala4Android, super cool)

Editor's Notes

  • #5: Seamless interop
  • #7: NULL MUST DIE - immutable/final stuff, a var is a code smell, you end up with very short classes/methods - Fluent iterable example/ power at your fingertips
  • #10: + equals/hashcode, copy constructor
  • #15: val list = List(1, 2, 3) vs. List<Integer> list = new ArrayList<>(); list.add(1); … OK Arrays.asList gibts aber für maps? val map = Map(“tom” -> 3, “joe” -> 6)
  • #28: Spring MVC with scala controllers/services I can give you lots of examples of really large companies who risked it and very successful The language takes some learning, some investment but it also rewards you Groovy vs scala