JavaRush /Java-Blog /Random-DE /Nicht einfache einfache Abläufe
Oleg Savenko
Level 41
Одесса

Nicht einfache einfache Abläufe

Veröffentlicht in der Gruppe Random-DE
Mit jeder neuen Java-Version wird es immer umfangreicher. Während ein Großteil des Reichtums in früheren Versionen steckt, hat sich die Sprache sowohl in der Methodik als auch in der Implementierung weiter verbessert. Sammlungen in Java sind keine Ausnahme. Das Kern-Collections-Framework erschien in J2SE 1.2 und entwickelte sich weiter, wobei es Änderungen gab, die eher erfreulich als enttäuschend waren. Mit der Veröffentlichung von JDK 5 ist die Arbeit mit Sammlungen komfortabler, schneller und einfacher geworden. Dies führte dazu, dass Programmierer begannen, sie intensiver auszunutzen. Für die Arbeit mit ihnen wurden bestimmte Muster entwickelt, die zweifellos wirksam sind. Aber mit JDK 8 wurden die Sammlungen wieder besser, und zwar dank Threads. Da die Sammlung in Form von Streams dargestellt werden kann, wird sich natürlich auch die Methodik für die Arbeit mit ihnen ändern. Deshalb möchte ich zeigen, wie bekannte und verständliche Lösungen mit Sammlungen noch einfacher werden.

Beispiel 1. Es könnte nicht einfacher sein

Beginnen wir natürlich mit dem Einfachsten, gehen wir alle Elemente der Sammlung durch und zeigen alle Elemente an.
// создадим и заполним список
   List<Integer> list = new ArrayList<>();
   Collections.addAll(list, 1, 5, 6, 11, 3, 15, 7, 8);
   // а теперь
   // быстрый for по всем Elementм, только для коллекций
   for (Integer i:list){
       System.out.println(i);
   }
   //но мы уже живем в JDK 8
   //а значит нужно так
   list.stream().forEach(System.out::println);
Wie Sie bemerkt haben, gibt es eine neue Syntax, die meiner Meinung nach als Java-Neuling viel einfacher ist. Was ist also in der neuen Syntax sichtbar:
берем_список(list).превращаем_в_поток(stream).перебираем_все_элементы(forEach)(тут_интуитивно_понятно)
System.out::println— ein Link zu einer statischen Methode, die einen String an die Konsole ausgibt. Anstelle eines Links zu einer statischen Methode können Sie einen etwas anderen, weniger klaren Eintrag verwenden:
list.stream().forEach(i -> System.out.println(i));
Dieser Eintrag verwendet Lambda-Ausdrücke. Und ja, um zu lernen, wie man mit Streams arbeitet, müssen Sie Lambda-Ausdrücke lernen – sie sind wunderbar. Darüber hinaus werde ich nicht zeigen, wie man mit Sammlungen nur mithilfe von Streams arbeitet, sondern verlasse mich darauf, dass Sie sich im Laufe des Kurses mit traditionellen Methoden vertraut gemacht haben.

Beispiel 2. Finden Sie gerade Werte in der Liste und zeigen Sie sie in der Konsole an

list.stream().filter(i -> i%2==0).forEach(System.out::println);
Das ganze Problem wurde in einer Zeile gelöst. Ich wünsche Ihnen viel Spaß bei der Arbeit in einer Zeile. Mit dieser Methode filterhaben wir den Stream gefiltert und den Rest auf der Konsole ausgegeben. Der Filter ist eine sehr leistungsstarke Sache, die in den unerwartetsten Fällen helfen kann. Lassen Sie uns kreativ werden und die Bedingungen des Problems ändern. Zum Beispiel müssen wir zählen, wie viele gerade Zahlen in der Liste enthalten sind:
long count = list.stream().filter(i -> i%2==0).count();
Und noch einmal in einer Zeile. Irgendwie scheint alles einfach zu sein. Im Filter haben wir einen Lambda-Ausdruck verwendet, wodurch nur gerade Zahlen in den neuen Stream eingefügt wurden, und dann auf den neuen Stream angewendet, countder zählte, wie viele Elemente sich im neuen Stream befinden.

Beispiel 3. Zählen wir, wie viele Wörter in der Liste 5 Zeichen lang sind

Wir haben mit ganzen Zahlen gespielt, jetzt spielen wir mit Wörtern.
List<String> list = new ArrayList<>();
Collections.addAll(list, "разые", "слова", "интересные", "Und", "Nicht", "Sehr");

System.out.println(list.stream().filter(w -> w.length() == 5).count());
Wir haben den Filter wieder verwendet. Im Filter wurde mithilfe eines Lambda-Ausdrucks ein neuer Stream angezeigt, und dann habe countich verständlicherweise berechnet, wie viele Elemente sich im neuen Stream befanden.

Beispiel 4. Drucken Sie eindeutige Wörter

Eine vertraute Aufgabe, wenn wir viele verschiedene Wörter aus einer Datei in eine Sammlung einlesen und jetzt nur noch eindeutige Wörter benötigen.
List<String> list = new ArrayList<>();
Collections.addAll(list, „Wasja“, "Таня", „Olja“, „Wasja“, „Olja“, "Сергей");

list.stream().distinct().forEach(System.out::println);
Die Hauptaktion wurde im Stream mit durchgeführt distinct. Als nächstes schlage ich vor, einen Blick auf einige unserer Aufgaben aus dem Kurs mithilfe von Threads zu werfen

Beispiel 5. Lange Wörter

Auf der 9. Ebene von Java Core gibt es in Vorlesung 11 ein interessantes Problem. Darin müssen Sie durch Kommas getrennte Wörter in Datei2 schreiben, deren Länge unbedingt größer als 6 ist. Egal welche Art von Garten Sie umzäunen, Ich schlage folgende Lösung vor:
  1. Aus der Quelldatei lesen wir alle Wörter in die Liste ein.

  2. Dann führen wir die folgende Zeile aus

    Optional<String> rezult = list.stream()
    				.filter(w->w.length()>6)
    				.reduce((w1,w2)->w1+", "+w2);
  3. result.get()in eine Datei schreiben.

Hier ist eine interessante Lösung mit Threads. Der Filter filterte und mithilfe von Reduce und einem regulären Ausdruck wurde die erforderliche Zeichenfolge generiert.

Beispiel 6. Wörter mit Zahlen

Schreiben Sie alle Wörter, die Zahlen enthalten, zum Beispiel a1 oder abc3d, getrennt durch ein Leerzeichen in Datei2. Dies ist auch eine Bedingung aus unserem Problembuch, wie Sie vermutet haben, ist die Lösung einfach.
Optional<String> rezult = list.stream()
				.filter(w->w.matches(".*?\\d+.*?"))
				.reduce((w1,w2)->w1+" "+w2);
Wir haben den Stream mit einem regulären Ausdruck gefiltert und ihn dann mit einem Lambda-Ausdruck reduziert. So viele Gemeinsamkeiten mit der vorherigen Aufgabe.

Beispiel 7. Zahlen auswählen

Die ganze Aufgabe hört sich so an:
  • Lesen Sie 2 Dateinamen von der Konsole.
  • Geben Sie in die zweite Datei alle Zahlen aus, die in der ersten Datei enthalten sind.
  • Zahlen werden durch Leerzeichen getrennt.
  • Streams schließen.
Für die Hauptaufgabe, die darin besteht, Zahlen in einen durch Leerzeichen getrennten String zu schreiben, schlage ich für das weitere Schreiben in eine Datei die Verwendung eines Streams vor, der so aussehen wird:
Optional<String> rezult = list.stream().filter(w->w.matches("\\d+"))
				.reduce((w1,w2)->w1+" "+w2);
System.out.println(rezult.get());
Mithilfe von Threads lässt sich das Problem auf sehr einfache Weise lösen. Aber siehe da, vergleichen Sie selbst diese Lösung mit den beiden vorherigen. Zum Abschluss des Artikels möchte ich euch gestehen: Leute, ich habe geschummelt, als ich Beispiele ausgewählt habe. Tatsache ist, dass ich die einfachsten Beispiele ausgewählt habe, um Ihnen anhand bekannter Probleme ein unbekanntes Thema zu zeigen. Natürlich werden Threads sowohl für einfache als auch für komplexere Aufgaben verwendet. Aber wie Horstman in seinem Buch betont: „Datenflüsse funktionieren nach dem Prinzip „was, nicht wie zu tun“.“, was bedeutet, dass viele zuvor komplexe Aufgaben einfacher werden können. Ich weiß nicht, wie es Ihnen geht, aber mir gefielen die Abläufe. Ich hoffe, ich habe Sie nicht davon abgehalten, sie zu lernen. Und lassen Sie mich noch etwas erklären:
  1. Ich hatte nicht vor, dem Leser beizubringen, wie man Streams in Sammlungen verwendet; ich bin kein besonders erfahrener Lehrer. Ich wollte Ihnen zeigen, dass Threads einfach und sehr interessant sind! Im Allgemeinen ist dies eine Notwendigkeit.
  2. Je besser ich Flows verstehe, desto mehr sehe ich Probleme, bei denen sie alle Probleme aus dem Lehrbuch lösen, was bedeutet, dass Flows nicht umsonst erfunden wurden.
  3. Streams sind nicht nur einfach zu bearbeiten, sie haben auch einen wichtigen Vorteil: Bei der Arbeit mit großen Datenmengen sind Streams oft produktiver.
PS . Ich habe über ALLE PROBLEME Witze gemacht. Empfehlenswert: Professionelle Java-Bibliothek. Band 2 Fortgeschrittene Programmierwerkzeuge. Kay Horstmann. Ich habe die zehnte Ausgabe.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION