Lambda-Ausdrücke und Streams

Seit Java 8 gibt es die Möglichkeit mit Streams zu arbeiten. Der Begriff kommt auch beim "Streamen von Filmen" vor. Das bedeutet einfach, dass ein Datenstrom (stream) schon während des Einlesens bearbeitet werden kann und nicht erst, wenn alles heruntergeladen ist.

Somit kann ein Film relativ schnell nach dem Drücken des -Knopfes betrachtet werden, ohne erst den gesamten Film heruntergeladen zu haben.

Das ist auch mit Hilfe von Streams in Java möglich. Dafür einige hilfreiche Links:

  • Einführung von Lambda-Ausdrücken und Streams

  • Streams anhand von Beispielen

  • Fortgeschrittene Betrachtungen zu Streams und Lambda-Funktionen der Fachhochschule Südwestfalen

  • Visualisierung verschiedener Stream-Funktionen

== Lambda-Ausdrücke und Streams Seit Java 8 gibt es die Möglichkeit mit Streams zu arbeiten. Der Begriff kommt auch beim "Streamen von Filmen" vor. Das bedeutet einfach, dass ein Datenstrom (_stream_) schon während des Einlesens bearbeitet werden kann und nicht erst, wenn alles heruntergeladen ist. Somit kann ein Film relativ schnell nach dem Drücken des icon:play[]-Knopfes betrachtet werden, ohne erst den gesamten Film heruntergeladen zu haben. Das ist auch mit Hilfe von Streams in Java möglich. Dafür einige hilfreiche Links: * https://blog.codecentric.de/2013/10/java-8-erste-schritte-mit-lambdas-und-streams/[Einführung von Lambda-Ausdrücken und Streams] * http://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/[Streams anhand von Beispielen] * https://www4.fh-swf.de/media/downloads/fbtbw/download_8/devries_1/Funktionen-Streams.pdf[Fortgeschrittene Betrachtungen zu Streams und Lambda-Funktionen der Fachhochschule Südwestfalen] * http://rxmarbles.com/[Visualisierung verschiedener Stream-Funktionen]

Parametrisierte Listen

== Parametrisierte Listen
ArrayList<Integer> liste=new ArrayList<>();
for (int i=0;i<1000;i++){
    liste.add((int)(Math.random()*100));
}
Java
[source, Java, indent=0] ---- ArrayList<Integer> liste=new ArrayList<>(); for (int i=0;i<1000;i++){ liste.add((int)(Math.random()*100)); } ----

Aufgaben

  1. Gib alle Zahlen aus.

  2. Gib alle Zahlen aus, die größer als 80 sind.

  3. Gib für jede Zahl die negative Hälfte aus, wenn sie gerade ist, sonst die Zahl selbst.

  4. Addiere alle Zahlen.

  5. Gib von allen Zahlen, die größer als 80 sind, die Summe aus, wobei gerade Zahlen vor dem Addieren halbiert und negiert werden.

== Aufgaben . Gib alle Zahlen aus. . Gib alle Zahlen aus, die größer als 80 sind. . Gib für jede Zahl die negative Hälfte aus, wenn sie gerade ist, sonst die Zahl selbst. . Addiere alle Zahlen. . Gib von allen Zahlen, die größer als 80 sind, die Summe aus, wobei gerade Zahlen vor dem Addieren halbiert und negiert werden.

Gib alle Zahlen aus

for (int i=0;i<liste.size();i++){
    System.out.println(liste.get(i));
}
Java
== Gib alle Zahlen aus [source,java,indent=0] ---- for (int i=0;i<liste.size();i++){ System.out.println(liste.get(i)); } ----
for (Integer wert:liste){
    System.out.println(wert);
}
Java
[source,java,indent=0] ---- for (Integer wert:liste){ System.out.println(wert); } ----
liste.stream().forEach(z->System.out.println(z));
Java
[source,java,indent=0] ---- liste.stream().forEach(z->System.out.println(z)); ----
liste.stream().forEach(System.out::println);
Java
[source,java,indent=0] ---- liste.stream().forEach(System.out::println); ----

Alle Zahlen größer als 80

for (int i=0;i<liste.size();i++){
    if (liste.get(i)>8000){
        System.out.println(liste.get(i));
    }
}
Java
== Alle Zahlen größer als 80 [source,java,indent=0] ---- for (int i=0;i<liste.size();i++){ if (liste.get(i)>8000){ System.out.println(liste.get(i)); } } ----
liste.stream().filter(z->z>80).forEach(System.out::println);
Java
[source,java,indent=0] ---- liste.stream().filter(z->z>80).forEach(System.out::println); ----

Für gerade Zahlen die negative Hälfte

for (int i=0;i<liste.size();i++){
    Integer ausgabe=liste.get(i);
    if (ausgabe%2==0){
        ausgabe=-ausgabe/2;
    }
    System.out.println(ausgabe);
}
Java
== Für gerade Zahlen die negative Hälfte [source,java,indent=0] ---- for (int i=0;i<liste.size();i++){ Integer ausgabe=liste.get(i); if (ausgabe%2==0){ ausgabe=-ausgabe/2; } System.out.println(ausgabe); } ----
liste.stream().map(z->z%2==0?-z/2:z).forEach(System.out::println);
Java
[source,java,indent=0] ---- liste.stream().map(z->z%2==0?-z/2:z).forEach(System.out::println); ----

Addiere alle Zahlen

Integer summe=0;
for (int i=0;i<liste.size();i++){
    summe+=liste.get(i);
}
System.out.println("Summe: "+summe);
Java
== Addiere alle Zahlen [source,java,indent=0] ---- Integer summe=0; for (int i=0;i<liste.size();i++){ summe+=liste.get(i); } System.out.println("Summe: "+summe); ----
System.out.println("Summe: "+liste.stream().reduce(0,(x,y)->x+y));
Java
[source,java,indent=0] ---- System.out.println("Summe: "+liste.stream().reduce(0,(x,y)->x+y)); ----

Alles zusammen

Integer summe=0;
for (int i=0;i<liste.size();i++){
    Integer wert=liste.get(i);
    if (wert<=80){
        wert=0;
    }
    if (wert%2==0){
        wert=-wert/2;
    }
    summe+=wert;
}
System.out.println(summe);
Java
== Alles zusammen [source,java,indent=0] ---- Integer summe=0; for (int i=0;i<liste.size();i++){ Integer wert=liste.get(i); if (wert<=80){ wert=0; } if (wert%2==0){ wert=-wert/2; } summe+=wert; } System.out.println(summe); ----
System.out.println("Summe: "+liste
        .stream()
        .filter(z->z>80)
        .map(z->z%2==0?-z/2:z)
        .reduce(0,(x,y)->x+y)
);
Java
[source,java,indent=0] ---- System.out.println("Summe: "+liste .stream() .filter(z->z>80) .map(z->z%2==0?-z/2:z) .reduce(0,(x,y)->x+y) ); ----