do-while mit Java8-Optional

8

In einigen meiner Projekte verwende ich häufig das Do-while-checkNextForNull-getNext-Schleifenmuster (ich weiß nicht, ob es einen offiziellen Namen dafür gibt). In Java8 wird die Verwendung von Optional als sauberer Code angesehen, als wenn in Client-Code auf Nullreferenzen geprüft wird. Aber wenn in diesem Looping-Muster Optional verwendet wird, wird der Code ein bisschen ausführlich und hässlich, aber da Optional einige praktische Methoden hat, würde ich erwarten, dass es einen saubereren Weg gibt als den, den ich unten gefunden habe.

Beispiel:

Gegeben die folgende Klasse.

%Vor%

In dem ersten Element hat immer nr == 1 und jedes Element bestimmt das nächste Element, und Sie möchten nicht unnötige neue Elemente erstellen.

Ich kann das folgende looping do-while-checkNextForNull-getNext-Muster im Client-Code verwenden:

%Vor%

Mit Java8-Optional wird die angegebene Klasse zu:

%Vor%

Und dann wird das Do-while-checkNextForNull-getNext-Schleifenmuster etwas hässlich und ausführlich:

%Vor%

Der orElse(null)) != null Teil fühlt sich unwohl an.

Ich habe nach anderen Arten von Schleifen gesucht, aber keine bessere gefunden. Gibt es eine sauberere Lösung?

Aktualisierung:

Es ist möglich, eine for-each-Schleife zu verwenden, während gleichzeitig Nullreferenzen vermieden werden (die Verwendung von Nullreferenzen wird als schlechte Praxis angesehen). Diese Lösung wurde von Xavier Delamotte vorgeschlagen und benötigt Java8-Optional nicht.

Implementierung mit einem generischen Iterator:

%Vor%

und

%Vor%

Dann wird der Client-Code sehr einfach / sauber:

%Vor%

Obwohl dies als eine Verletzung des Iterator-Vertrags angesehen werden kann, weil das new Item(1) -Objekt in der Schleife enthalten ist, während normalerweise die for-Schleife sofort next () aufrufen und somit das erste Objekt überspringen würde. Mit anderen Worten: Für das erste Objekt wird next () verletzt, weil es das erste Objekt selbst zurückgibt.

    
Devabc 26.02.2015, 11:48
quelle

4 Antworten

7

Sie können so etwas tun:

%Vor%

oder (um die zusätzliche Variable zu vermeiden):

%Vor%     
Eran 26.02.2015 11:54
quelle
6
  

In Java8 wird die Verwendung von Optional als sauberer Code angesehen als die Überprüfung auf Null-Referenzen in Client-Code

Nein, es ist genau umgekehrt: Optional kann verwendet werden, wo hilft saubereren Code zu schreiben. Wo es nicht ist, bleiben Sie einfach beim alten Idiom. Fühle keinen Druck, es zu benutzen, wenn dein bestehendes Idiom gut aussieht - und das tut es meiner Meinung nach. Als ein Beispiel wäre dies eine gute Verwendung des Optional:

%Vor%

Da Sie bei der ersten nicht vorhandenen Option aus der Schleife ausbrechen müssen, hilft das nicht wirklich.

Ich gehe jedoch davon aus, dass Ihr wahres Interesse allgemeiner ist: Nutzen Sie die Funktionen von Java 8 für Ihren Code. Die Abstraktion, die Sie auswählen sollten, ist der Stream:

%Vor%

Und natürlich können Sie jetzt mit der Stream-Verarbeitung loslegen:

%Vor%

So würden Sie den Stream erstellen:

%Vor%

Damit sind Sie nur einen kleinen Schritt von der Möglichkeit entfernt, Ihre Berechnungen nahtlos zu parallelisieren. Da Ihr Artikel-Stream grundsätzlich sequenziell ist, schlage ich vor, dass Sie in meine Blogpost zu diesem Thema.

    
Marko Topolnik 26.02.2015 11:55
quelle
3

Fügen Sie einfach die Schleifenunterstützung zu Ihrer API hinzu:

%Vor%

Dann können Sie einfach über Lambda-Ausdruck

iterieren %Vor%

oder Methodenreferenzen

%Vor%

Wenn Sie anspruchsvollere Operationen als nur forEach-Loops unterstützen möchten, ist unterstützende Streams der richtige Weg. Es ist ähnlich, da Ihre Implementierung kapselt, wie Sie über Item s iterieren.

    
Holger 26.02.2015 13:11
quelle
0

Da dies mit einer Art von Design zusammenhängt, komme ich unter Design.

Erstellen Sie Schnittstelle, die unterstützt, um optional als nächstes zur Verfügung zu stellen.

%Vor%

Der Artikel implementiert die NextProvidble-Schnittstelle.

%Vor%

Hier verwende ich /..someCondition..../ als nr & lt; 10

Und neue Klasse für Custom Do While wie unten.

%Vor%

Nun, was Sie in Ihrem Client-Code getan haben.

%Vor%

Es kann sehr klar sein. Bitte füge deine Gedanken hinzu.

    
Chamly Idunil 05.07.2017 07:26
quelle