Lambdas
Wenn 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 return
und 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.
if-else
;char
als Betriebsanzeige;switch-case
;- und alles andere, was Ihnen in den Sinn kommt.
- Nur Lambdas, die Aufgabe liegt bei ihnen.
inputStream
und 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
return
und dann gibt es einen ganzen Stream. Lassen wir die Anforderung wegStringBuilder
. -
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.
-
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).
GO TO FULL VERSION