Ich habe den folgenden Code, der über Java DateTimeFormatter
Musterkombinationen von "E".."EEEE"
und "M".."MMMM"
iteriert.
Meine Frage ist, gibt es eine idiomatische (oder einfach "mehr idiomatische") Möglichkeit, Java Streams in diesem Fall zu verwenden?
%Vor%Ausgabe
%Vor% Sie verwenden ein IntStream
to Laufwerk die Zeichenfolge. Das ist eine Möglichkeit, und hier sind zwei andere Möglichkeiten:
Dies erzeugt rekursiv ein Stream
, während der andere Weg wie folgt aussehen würde:
Dies wendet die gegebene Funktion auf das vorherige Ergebnis an. Da es einen unendlichen Stream erstellt, müssen Sie limit
verwenden.
Ich habe Ihre main
Methode leicht modifiziert, so dass Sie eine map
Operation vermeiden:
Ich weiß wirklich nicht, ob die oben genannten Wege mehr oder weniger idiomatisch sind als deine Art, aber wenn du mich fragst, ist der idiomatische Weg, diese Aufgabe zu erledigen, eine verschachtelte Schleife:
%Vor%Und dies könnte wie folgt in Java 8 übersetzt werden:
%Vor% Ich würde die Art ändern, in der Sie wiederholte Läufe eines Zeichens erzeugen: Anstatt die längste Zeichenkette manuell zu konstruieren und dann ihre Präfixe zu iterieren, würde ich Läufe mit Collection.nCopies
wie folgt erstellen:
Sie würden dann substrings("EEEE")
durch repeatedRuns("E", 1, 4)
ersetzen.
Ich würde überhaupt nicht über Teilstrings streamen. Es genügt, über etwas zu streamen, das die sechzehn Kombinationen repräsentiert, und die Formatzeichenfolge in einem Arbeitsgang zu erstellen:
%Vor% Die Tatsache, dass es sich um vier mal vier Kombinationen handelt, macht die Berechnung für billige Bitarithmetik geeignet, aber im Prinzip ist jede n x m -Kombination durch Streaming von 0 möglich zu n × m und zur Auswahl des Elements i/n
und i%n
verwenden (z. B. die Operation substring
ausführen). Der vorhergehende .map(i -> 15-i)
-Schritt kehrt nur die Reihenfolge um, damit sie mit Ihrem ursprünglichen Code übereinstimmt. Sie können es weglassen, wenn die Reihenfolge keine Rolle spielt.
Tags und Links java substring java-stream