JavaRush /Java-Blog /Random-DE /Lambdas und Streams, nur Praxis, keine Theorie

Lambdas und Streams, nur Praxis, keine Theorie

Veröffentlicht in der Gruppe Random-DE
Hallo zusammen. Anlässlich des Wettbewerbs habe ich beschlossen, hier keinen Artikel, sondern eine kurze Lektion zu schreiben. Es geht um Lambdas und Streams in Java. Wenn Sie diese bereits kennen und nutzen, dann springen Sie direkt zum Ende des Artikels, dort finden Sie eine kleine Auswahl an Aufgaben mit JavaRush, an denen Sie üben können. Sie benötigen Java 8 und höher, eine Ausbildung bei JR, es wird nur wenige Details und viele unverständliche Dinge geben, ein starker Wunsch, es herauszufinden. Beginnen wir mit der Tatsache, dass ich die Entstehungsgeschichte von Lambdas und Streams nicht erklären werde, ich weiß es einfach selbst nicht. Ich weiß nur, dass sie vom funktionalen Programmierstil zu unserem OOP-Stil kamen. In meiner kurzen Lernerfahrung habe ich einfach gezeigt, wie und was. Manchen Menschen fällt es schwer, die Idee zu verstehen. Denken Sie also daran, wie man schreibt, Sie werden es später verstehen.

Lambdas

Lambdas und Streams, nur Praxis, keine Theorie – 1Lambdas und Streams, nur Praxis, keine Theorie – 2Wenn Sie überhaupt nicht wissen, was Lambdas sind, dann: Ein Lambda sieht so aus:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Das ist genug für jetzt. Sie können die Theorie hier lesen: Link eins , Link zwei , aber ich denke, dass die Praxis viel mehr Spaß macht. Ich schlage vor, dass Sie das folgende Problem lösen: Schreiben Sie einen Taschenrechner mit Methode 1. Die Methode sollte 2 digitale Werte und etwas anderes akzeptieren. Ihr Code sieht in etwa so aus:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Sie müssen 3 Parameter in die Methodensignatur eingeben calculate, 1 Befehl hinzufügen returnund den Aufruf dieser Methode testen main. Was soll diese Methode können?
  • falten;
  • multiplizieren;
  • teilen;
  • subtrahieren;
  • berechne die Wurzel;
  • zur Macht erheben;
  • Potenzieren Sie die Summe der Argumente dividiert durch die erste Zahl + 117;
  • und alle anderen Operationen, die Sie sich vorstellen können.
Was Sie nicht verwenden sollten:
  • if-else;
  • charals Betriebsanzeige;
  • switch-case;
  • und alles andere, was Ihnen in den Sinn kommt.
Was Sie verwenden können:
  • Nur Lambdas, die Aufgabe liegt bei ihnen.
- Was? Und das ist alles? - Ja, das ist alles, denn Sie müssen buchstäblich drei Zeilen hinzufügen. Wenn ich mindestens eine vorschlage, wird der Rest automatisch geschrieben. Und wenn Sie möchten, können Sie Beispiele googeln und versuchen, sie zu verstehen. Natürlich werden Sie sich selbst überprüfen und wenn Sie betrügen, wird es niemand erfahren, aber warum dann? Nachdem ich ein so einfaches Problem gelöst hatte, erlangten alle meine 1,5 Schüler ein grobes Verständnis davon, was Lambdas sind und wie man sie verwendet. Dies wird für das Streaming unbedingt erforderlich sein. Wenn Sie mit dem Ergebnis prahlen und herausfinden möchten, ob Sie es richtig gemacht haben, senden Sie den Code in einer privaten Nachricht. Es besteht keine Notwendigkeit zu kommentieren, Sie können dort interessante Tipps hinzufügen (aber so, dass die Aufgabe nicht zu einfach wird). Auch hier sollten Sie nach der Lösung dieses Beispiels bereits ein grobes Verständnis für die Verwendung von Lambdas haben.
Lambdas und Streams, nur Praxis, keine Theorie – 3
Kommen wir nun zu den Java-Streams. Dies sind nicht die Streams, an die Sie als Leser vielleicht gedacht haben. Nein, das ist es nicht inputStreamund das ist es auch nicht OutputStream. Es ist anders, es ist interessanter. Streams haben Zyklen ersetzt, nicht vollständig, aber dennoch. Sie werden nach dem Motto bedient: „Erkläre nicht, wie es geht, sondern erkläre, was zu tun ist.“ Ein kleines Beispiel für einen Stream:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Was ist denn hier los? Fügen wir Kommentare hinzu:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Vergleichen Sie mit einer regulären Schleife:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Wenn Sie den Code lesen, sieht alles beängstigend aus, aber ist es mit Kommentaren einfacher? Das ist normal, ich habe sie auch lange nicht verstanden. Der Schlüssel zum Verständnis ist Übung. Deshalb beginnen wir, Artikel von Drittanbietern zu lesen und nach Antworten auf unsere Fragen zu suchen. Sie können sie auch hier in den Kommentaren stellen. Ich werde keine vollständige Antwort geben, aber ich werde die Richtung angeben. Liste der Aufgaben von JavaRush, die meiner Meinung nach gut zum Üben von Streaming geeignet sind:
  • 2208 – kann mit 1 Stream und 1 Return gelöst werden, d.h. Der Hauptteil der Methode beginnt mit returnund dann gibt es einen ganzen Stream. Lassen wir die Anforderung weg StringBuilder.

  • 1908 – man kann es auch mit 1 Stream und 1 Return lösen. Beginnen Sie mit dem Lesen der Datei. Ich weiß nicht, wie man über Streams in eine Datei aufzeichnet (falls das möglich ist), im Moment machen wir das manuell. Diese. Wir öffnen nur 2 Streams (Konsole und Schreiben in eine Datei). Wir lesen die Datei über Methoden, die uns entweder ein Blatt oder einen Stream zurückgeben (Google und Javadoc).

  • 1907 – theoretisch kann es auch in einem Stream gelöst werden. Die Eingabe in den Stream ist der Dateiname, die Ausgabe ist die Anzahl der Wörter weltweit.

Das ist alles. Wenn ich kann, schreibe ich eine weitere einfache Geschichte. Meiner Meinung nach ist es irgendwie langweilig oder so, über etwas Cooles zu lesen, ohne die Möglichkeit zu haben, es auszuprobieren. Und nach dem Taschenrechner und drei Rätseln denke ich, dass Sie mit Lambdas und Streams bereits gut zurechtkommen. Informieren Sie sich also über alle Möglichkeiten, falls Sie es noch nicht getan haben. UPD:
  • 1016 – etwas pervers kann man es in 1 Stream und 1 Return lösen;

  • 1821 – sehr einfach und in 1 Stream und 1 Return.

    Diese beiden Aufgaben führen Sie in eine andere Streaming-Methode und einen anderen Collector ein.

  • 1925 – Sie können eine Zeile mit Wörtern in einem Stream abrufen und diese dann in eine Datei schreiben (ich weiß nicht, ob es möglich ist, aus einem Stream in eine Datei zu schreiben).

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION