-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Dungeon: do not throw exceptions in stream operations (refactoring, SpikeSystem) #1567
Conversation
@AMatutat Ich habe nochmal filteredEntityStream(SpikyComponent.class)
.flatMap((e -> e.fetch(SpikyComponent.class).stream()))
.forEach(SpikyComponent::reduceCoolDown); vs. filteredEntityStream(SpikyComponent.class)
.map((e -> e.fetch(SpikyComponent.class)))
.flatMap((Optional::stream))
.forEach(SpikyComponent::reduceCoolDown); Meinungen? |
Aus einem Studi gezielten Blickwinkel finde ich Nummer 2 besser. Da wird die Optional geschichte nochmal sichtbar. |
ja, finde ich auch. flatmap sagt zwar auch schon alles an sich, aber das extra .stream() ist typisch java - die java-designer haben vermutlich im meeting gesessen und gedacht "lasst mal sehen, was ist die bescheuertste ausdrucksform? supi, das nehmen wir so." 🫣🤣 |
@AMatutat Noch eine andere Variante: (A) filteredEntityStream(SpikyComponent.class)
.map(e -> e.fetch(SpikyComponent.class))
.forEach(sc -> sc.ifPresent(SpikyComponent::reduceCoolDown)); vs. Vorschlag (2) von oben (B) filteredEntityStream(SpikyComponent.class)
.map(e -> e.fetch(SpikyComponent.class))
.flatMap((Optional::stream))
.forEach(SpikyComponent::reduceCoolDown); Im Grunde führen Meinungen? Eine dieser beiden Varianten würde ich tatsächlich einchecken, d.h. aus meiner Sicht sind beide besser als das Original. |
98cafc4
to
26d87f1
Compare
@AMatutat Präferenzen? (A) oder (B)? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
klammerpaar zuviel/doppelt
keine reaktion von @AMatutat ... going w/ (b). |
see #1564 (comment)
In
wird ein Stream aller Entitäten mit einer
SpikyComponent
vomSystem
angefordert. Bei der Iteration über diese Entitäten wird dann (a) dieSpikyComponent
extrahiert, (b) eine Exception geworfen im Nichtvorhandensein-Fall, und (c) auf der Component eine Methode aufgerufen.Dies ist aus zwei Gründen problematisch: Zum werden mehrere Operationen in die
forEach
-Schleife verpackt, und zum anderen sollte man keine Exceptions in einer Stream-Operation werfen. (OK, das dürfte hier in der Realität auch nie passieren, da wir ja vorher exakt nach der Component gefiltert hatten. Dennoch.)Dieser PR führt ein Refactoring durch und erledigt in jedem Stream-Step eine Sache. Außerdem wird keine Exception mehr in der Stream-Verarbeitung geworfen, sondern Entitäten, die zwischen
System#filteredEntityStream
und demforEach
auf geheimnisvolle Weise ihreSpikyComponent
verloren haben sollten, werden einfach ignoriert.Keine Änderung der API und/oder des Verhaltens.