Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Insert company logo
New Technology
Scala: Durch Java 8 überflüssig geworden?
Lutz Hühnken / @lutzhuehnken
@lutzhuehnken 29...
Was macht funktionale
Programmierung aus?
• Funktionen
• (Unveränderliche) Werte
• Keine Seiteneffekte
Funktionen
• Code vs. Daten
scala> val sum = (x:Int, y:Int) => x + y
Type of sum is (Int, Int) => Int
Werte
• Wert vs. Identität
• kein PlOP
Integer x = new Integer(5)
String hello = „Hello“
Keine Seiteneffekte
• Ausdrücke evaluieren vs. Anweisungen ausführen
• Ziel: Referenzielle Transparenz
Funktionale Programmierung
Scala vs. Java8
Die Disziplinen
• Funktionen höherer Ordnung
• Unveränderliche Werte und Datenstrukturen
• Currying, partiell evaluierte F...
Die Teams
• Scala - http://www.scala-lang.org
• Vereinigt OO mit FP
• Java8 mit Verstärkung:
• Immutables - https://immuta...
Funktionen
List<String> getNames(List<Customer> customers) {
List<String> names = new ArrayList<String>();
for (customer :...
Funktionen
val names = customers.map(_.name)
Scala
Funktionen


List<String> names =
myList.stream()
.map(c -> c.name)
.collect(Collectors.toList());
Java 8
Funktionen


List<String> names = customers.map(c -> c.name);
Javaslang
Unveränderliche Werte
• Werte sind unveränderlich - nicht nur die Referenz
(final), auch das Object, auf das sie zeigt! 

...
Werte
case class Time(hours: Int = 0, minutes: Int = 0)
val t1 = Time(12,0)
val t2 = Time(hours = 12)
val t3 = t2.copy(min...
Werte
@Immutable
public final class Time {
public final Integer hours;
public final Integer minutes;
public Time(Integer h...
Werte
import org.immutables.value.Value;
@Value.Immutable
public abstract class Time {
public abstract Integer hours();
pu...
Werte
Time t1 =
ImmutableTime.builder()
.hours(12)
.minutes(0)
.build();
Immutables
Werte
Halva
@CaseClass
public interface Time {
Integer hours();
Integer minutes();
}
Time t1 = new TimeCase(12,0);
Unveränderliche Datenstrukturen
Für Aggregate (Collections) muss das gleiche gelten wie
für ihre Elemente!
Auch sie wollen...
Datenstrukturen (Collections)
scala> val v1 = Vector(1,2,3)
v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
s...
Datenstrukturen (Collections)
import org.pcollections.PVector;

import org.pcollections.TreePVector;

PVector<Integer> pv1...
Collections
• Fokussiert auf persistente Collections
• Minimale API (plus, minus, with..)
• Keine zusätzlichen Methoden, k...
Datenstrukturen (Collections)
import javaslang.collection.Vector;
Vector<Integer> v1 = Vector.of(1,2,3);

v1.update(0,3);
...
Javaslang
• Bietet „reiche“ API (mit drop, take, permutation, map,
flatMap, filter, collect, sliding, etc., entsprechend
S...
Currying
scala> def sum(a:Int)(b:Int) = a + b
sum: (a: Int)(b: Int)Int
scala> val sum2: Function[Int,Int] = sum(2)
sum2: F...
Currying
Function2<Integer, Integer, Integer> sum = (a, b) -> a + b;
Function1<Integer, Integer> add2 = sum.curried().appl...
Tupel
scala> val java8 = ("Java", 8)
java8: (String, Int) = (Java,8)
scala> java8._1
res0: String = Java
scala> java8._2
r...
Tupel
Tuple2<String, Integer> java8 = Tuple.of("Java", 8);
String s = java8._1; // "Java"
Integer i = java8._2; // 8
List<...
Pattern Matching
val s = i match {
case 1 => "one"
case 2 => "two"
case _ => "?"
}
Scala
Pattern Matching
String s = Match(i).of(
Case($(1), "one"),
Case($(2), "two"),
Case($(), "?")
);
Javaslang
Ausdrücke
• Ausdrücke („Expressions“) vs. Befehle („Statements“).
• Statements haben kein Ergebnis und werden nur um
des S...
Ausdrücke
for {
n <- 1 to 3
m <- 1 to n
} yield n * m
res0: Vector(1, 2, 4, 3, 6, 9)
scala> val b = if (3 < 4) "yes" else ...
Rekursion
def factorial(n: Int, acc: BigInt = 1): BigInt =
if (n == 0) acc else factorial(n - 1, n * acc)
Scala
Rekursion
• In Scala ok, da rechtsrekursiv (tail recursive)
• In Java - java.lang.StackOverflowError
Problemfelder in Java
• Syntax - Unterstützung für Datenklassen (kommt in
Java 10?), Tupel fehlt
• Unveränderliche Datenst...
Fazit
• Mit der Kombination Lambdas, Javaslang und Halva
oder Immutables lässt sich brauchbar funktional
programmieren - e...
Insert company logo
New Technology
Scala: Durch Java 8 überflüssig geworden?
Antwort: Nein.
Lutz Hühnken / @lutzhuehnken
@...
Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016
Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016
Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016
Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016
Nächste SlideShare
Wird geladen in …5
×

Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016

123 Aufrufe

Veröffentlicht am

Vergleich der Unterstützung funktionaler Programmierung in Java 8 und Scala.

Veröffentlicht in: Software
  • DOWNLOAD FULL BOOKS, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Antworten 
    Sind Sie sicher, dass Sie …  Ja  Nein
    Ihre Nachricht erscheint hier
  • Gehören Sie zu den Ersten, denen das gefällt!

Funktionale Programmierung in Java 8 und Scala auf der CodeTalks Hamburg am am 29.9.2016

  1. 1. Insert company logo New Technology Scala: Durch Java 8 überflüssig geworden? Lutz Hühnken / @lutzhuehnken @lutzhuehnken 29/09/2016
  2. 2. Was macht funktionale Programmierung aus? • Funktionen • (Unveränderliche) Werte • Keine Seiteneffekte
  3. 3. Funktionen • Code vs. Daten scala> val sum = (x:Int, y:Int) => x + y Type of sum is (Int, Int) => Int
  4. 4. Werte • Wert vs. Identität • kein PlOP Integer x = new Integer(5) String hello = „Hello“
  5. 5. Keine Seiteneffekte • Ausdrücke evaluieren vs. Anweisungen ausführen • Ziel: Referenzielle Transparenz
  6. 6. Funktionale Programmierung Scala vs. Java8
  7. 7. Die Disziplinen • Funktionen höherer Ordnung • Unveränderliche Werte und Datenstrukturen • Currying, partiell evaluierte Funktionen • Tupel • Pattern Matching • Ausdrücke • Rekursion
  8. 8. Die Teams • Scala - http://www.scala-lang.org • Vereinigt OO mit FP • Java8 mit Verstärkung: • Immutables - https://immutables.github.io • PCollections - http://pcollections.org • Javaslang - http://www.javaslang.io • Halva - https://github.com/soabase/soabase-halva
  9. 9. Funktionen List<String> getNames(List<Customer> customers) { List<String> names = new ArrayList<String>(); for (customer : customers) { names.add(customer.getName()); } return names; } Was wir nicht (mehr) wollen
  10. 10. Funktionen val names = customers.map(_.name) Scala
  11. 11. Funktionen 
 List<String> names = myList.stream() .map(c -> c.name) .collect(Collectors.toList()); Java 8
  12. 12. Funktionen 
 List<String> names = customers.map(c -> c.name); Javaslang
  13. 13. Unveränderliche Werte • Werte sind unveränderlich - nicht nur die Referenz (final), auch das Object, auf das sie zeigt! 
 Werte • Können geteilt werden • Haben stabilen Hashcode • Können übertragen werden
  14. 14. Werte case class Time(hours: Int = 0, minutes: Int = 0) val t1 = Time(12,0) val t2 = Time(hours = 12) val t3 = t2.copy(minutes = 30) Scala
  15. 15. Werte @Immutable public final class Time { public final Integer hours; public final Integer minutes; public Time(Integer hours, Integer minutes) { this.hours = hours; this.minutes = minutes; } @Override public boolean equals(@Nullable Object other) { if (this == other) return true; if (!(other instanceof Time)) return false; Time otherTime = (Time) other; return hours.equals(otherTime.hours) && minutes.equals(otherTime.minutes); } @Override public int hashCode() { return Objects.hash(hours, minutes); } @Override public String toString() { return MoreObjects.toStringHelper("Time") .add("hours", hours).add("minutes", minutes).toString(); } } Java 8
  16. 16. Werte import org.immutables.value.Value; @Value.Immutable public abstract class Time { public abstract Integer hours(); public abstract Integer minutes(); } Immutables
  17. 17. Werte Time t1 = ImmutableTime.builder() .hours(12) .minutes(0) .build(); Immutables
  18. 18. Werte Halva @CaseClass public interface Time { Integer hours(); Integer minutes(); } Time t1 = new TimeCase(12,0);
  19. 19. Unveränderliche Datenstrukturen Für Aggregate (Collections) muss das gleiche gelten wie für ihre Elemente! Auch sie wollen wir teilen und übertragen können - kein „PlOP“.
  20. 20. Datenstrukturen (Collections) scala> val v1 = Vector(1,2,3) v1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) scala> v1.updated(0,3) res0: scala.collection.immutable.Vector[Int] = Vector(3, 2, 3) scala> v1 res1: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) Scala
  21. 21. Datenstrukturen (Collections) import org.pcollections.PVector;
 import org.pcollections.TreePVector;
 PVector<Integer> pv1 = TreePVector.from(Arrays.asList(1,2,3));
 pv1.with(0,3);
 System.out.println(pv1.toString()); // [1, 2, 3]
 PCollections
  22. 22. Collections • Fokussiert auf persistente Collections • Minimale API (plus, minus, with..) • Keine zusätzlichen Methoden, keine Lambda- Unterstützung • Drop-In-Replacement (PVector implementiert java.util.List, HashPMap impl. java.util.Map..)
  23. 23. Datenstrukturen (Collections) import javaslang.collection.Vector; Vector<Integer> v1 = Vector.of(1,2,3);
 v1.update(0,3); System.out.println(v1.mkString(",")); // (1,2,3) Javaslang
  24. 24. Javaslang • Bietet „reiche“ API (mit drop, take, permutation, map, flatMap, filter, collect, sliding, etc., entsprechend Scala-Collections.), inkl. Funktionen höherer Ordnung. • Kein Drop-In-Replacement (implementiert nicht java.util.Collection etc.)
  25. 25. Currying scala> def sum(a:Int)(b:Int) = a + b sum: (a: Int)(b: Int)Int scala> val sum2: Function[Int,Int] = sum(2) sum2: Function[Int,Int] = <function1> scala> sum2(4) res1: Int = 6 Scala
  26. 26. Currying Function2<Integer, Integer, Integer> sum = (a, b) -> a + b; Function1<Integer, Integer> add2 = sum.curried().apply(2); add2.apply(4) // 6 Javaslang
  27. 27. Tupel scala> val java8 = ("Java", 8) java8: (String, Int) = (Java,8) scala> java8._1 res0: String = Java scala> java8._2 res1: Int = 8 scala> List("a","b","c").zip(List(1,2,3)) res2: List[(String, Int)] = List((a,1), (b,2), (c,3)) Scala
  28. 28. Tupel Tuple2<String, Integer> java8 = Tuple.of("Java", 8); String s = java8._1; // "Java" Integer i = java8._2; // 8 List<Tuple2<String,Integer>> zipped = List.of("a", "b", "c").zip(List.of(1,2,3));
 System.out.println(zipped.mkString(", ")); // (a, 1), (b, 2), (c, 3)
 Javaslang
  29. 29. Pattern Matching val s = i match { case 1 => "one" case 2 => "two" case _ => "?" } Scala
  30. 30. Pattern Matching String s = Match(i).of( Case($(1), "one"), Case($(2), "two"), Case($(), "?") ); Javaslang
  31. 31. Ausdrücke • Ausdrücke („Expressions“) vs. Befehle („Statements“). • Statements haben kein Ergebnis und werden nur um des Seiteneffekts wegen ausgeführt. • Wichtige Java-Kontrollstrukturen sind Statements (if, for, while, try…). • In Scala ist alles ein Ausdruck.
  32. 32. Ausdrücke for { n <- 1 to 3 m <- 1 to n } yield n * m res0: Vector(1, 2, 4, 3, 6, 9) scala> val b = if (3 < 4) "yes" else "no" b: String = yes Scala
  33. 33. Rekursion def factorial(n: Int, acc: BigInt = 1): BigInt = if (n == 0) acc else factorial(n - 1, n * acc) Scala
  34. 34. Rekursion • In Scala ok, da rechtsrekursiv (tail recursive) • In Java - java.lang.StackOverflowError
  35. 35. Problemfelder in Java • Syntax - Unterstützung für Datenklassen (kommt in Java 10?), Tupel fehlt • Unveränderliche Datenstrukturen (Collections) fehlen • Zu viele Anweisungen (if, switch, for..), zu wenig Ausdrücke • Checked Exceptions • Keine Tail-Call-Optimierung für rechtsrekursive Funktionen
  36. 36. Fazit • Mit der Kombination Lambdas, Javaslang und Halva oder Immutables lässt sich brauchbar funktional programmieren - es gibt also keine Ausrede! • Es gibt aber noch viel zu tun! Scala bleibt fürs erste die deutlich komfortablere Lösung.
  37. 37. Insert company logo New Technology Scala: Durch Java 8 überflüssig geworden? Antwort: Nein. Lutz Hühnken / @lutzhuehnken @lutzhuehnken 29/09/2016

×