Dieser Artikel fasst das Verhalten beim Inkrementieren mit dem dritten Argument der iterierten Methode der aus Java 9 hinzugefügten Stream-Klasse zusammen.
Ich sehe den folgenden Code oft als eine Möglichkeit, die iterate-Methode zu verwenden, die drei Eingabeargumente für die Stream-Klasse enthält.
Stream.Beispielcode für die Verwendung von Iteration
//Code, der einen numerischen Wert von 0 bis 9 ausgibt
Stream.iterate(0, i -> i < 10, i -> i + 1).forEach(System.out::println);
Ausführungsergebnis
0
1
2
3
4
5
6
7
8
9
Die Argumente der iterierten Methode lauten wie folgt. ** Erstes Argument **: Anfangswert ** Zweites Argument **: Eine Klasse, die eine Bedingung für die Rückgabe des nächsten Stream-Elements zurückgibt (beschrieben in einem Lambda-Ausdruck im Beispielcode). ** Drittes Argument **: Klasse, die das Element des nächsten Streams zurückgibt (beschrieben im Lambda-Ausdruck im Beispielcode) Das Umschreiben in die herkömmliche for-Anweisung ist wie folgt.
Code, der den Beispielcode in die herkömmliche for-Anweisung umschreibt
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
Als ich zum ersten Mal davon erfuhr, war ich beeindruckt, dass die Stream-API für satzähnliche Dinge verwendet werden kann.
Die Java-API-Dokumentation ist unten verlinkt. [Stream.iterate-Spezifikationen aus der Java-API-Dokumentation](https://docs.oracle.com/javase/jp/9/docs/api/java/util/stream/Stream.html#iterate-T-java.util .function.Predicate-java.util.function.UnaryOperator-)
Ich habe mich über die Tatsache gewundert, dass das dritte Argument oft durch i-> i + 1 ohne Inkrement erklärt wird, also habe ich Folgendes geschrieben.
Code, der das dritte Argument des Beispielcodes neu schreibt?
Stream.iterate(0, i -> i < 10, i -> i++).forEach(System.out::println);
Dann ist das Ausführungsergebnis wie folgt.
Ausführungsergebnis
0
0
0
0
0
0
0
0
~~~~~~~~~~~~~~~~~~~~~~
Unten wird 0 endlos ausgegeben, daher wird es weggelassen.
~~~~~~~~~~~~~~~~~~~~~~
Das Ergebnis wird mit i = 0 ausgegeben und es tritt eine Endlosschleife auf. Da die Apply-Methode der UnaryOperator-Klasse verwendet wird, die im dritten Argument in Stream.class angegeben ist (beschrieben im Lambda-Ausdruck im Beispielcode), wird sie zurückgegeben, bevor der Wert im dritten Argument erhöht wird. Wenn Sie es wirklich erhöhen möchten, müssen Sie es wie folgt vom Suffix zum Präfix umschreiben.
Code, der das dritte Argument des Beispielcodes neu schreibt
Stream.iterate(0, i -> i < 10, i -> ++i).forEach(System.out::println);
Da es eine solche Funktion zum Inkrementieren gibt, kann sie bei der Einführung in i-> i + 1 geschrieben werden. Wenn Sie persönlich schreiben, scheint es Inkrement zu verwenden. Erstens benutze ich Java erst nach 9 für mich ...
Recommended Posts