CodeTalks Scala Vs Java8 (Scala Programming Java)
CodeTalks Scala Vs Java8 (Scala Programming Java)
@lutzhuehnken 29/09/2016
Was macht funktionale
Programmierung aus?
• Funktionen
• (Unveränderliche) Werte
• Keine Seiteneffekte
Funktionen
• Scala - http://www.scala-lang.org
• Vereinigt OO mit FP
Scala
Java 8
List<String> names =
myList.stream()
.map(c -> c.name)
.collect(Collectors.toList());
Funktionen
Javaslang
List<String> names = customers.map(c -> c.name);
Unveränderliche Werte
Scala
val t1 = Time(12,0)
Java 8 @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();
}
}
Werte
Immutables
import org.immutables.value.Value;
@Value.Immutable
public abstract class Time {
public abstract Integer hours();
public abstract Integer minutes();
}
Werte
Immutables
Time t1 =
ImmutableTime.builder()
.hours(12)
.minutes(0)
.build();
Werte
Halva
@CaseClass
public interface Time {
Integer hours();
Integer minutes();
}
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)
Datenstrukturen (Collections)
PCollections
import org.pcollections.PVector;
import org.pcollections.TreePVector;
pv1.with(0,3);
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
scala> sum2(4)
res1: Int = 6
Currying
Javaslang
Function2<Integer, Integer, Integer> sum = (a, b) -> a + b;
add2.apply(4) // 6
Tupel
Scala
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))
Tupel
Javaslang
Tuple2<String, Integer> java8 = Tuple.of("Java", 8);
Integer i = java8._2; // 8
String s = Match(i).of(
Case($(1), "one"),
Case($(2), "two"),
Case($(), "?")
);
Ausdrücke
res0: Vector(1, 2, 4, 3, 6, 9)
@lutzhuehnken 29/09/2016