Während ich meine API entwickle, die an keinen Legacy-Code gebunden ist, schreibe ich häufig Methoden, bei denen es sich um reine Streams-Pipeline handelt, die durch das Sammeln der Ergebnisse beendet wird. Wie dieser:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Die meisten Clients dieser Klasse benötigen normalerweise die Auflistung (in diesem Fall ein ImmutableSet), um Elemente zu durchsuchen und darüber zu iterieren. Einige Clients können jedoch von einem Stream profitieren, sodass sie darüber hinaus noch weitere Operationen weiterleiten können Stream, ohne dass ein neuer Stream aus der Sammlung abgerufen werden muss. Wenn Sie also einen Stream zurückgeben, erhalten die Kunden eine Reihe von Optionen, die sie hätten, wenn sie nur die Sammlung hätten (schließlich können sie collect()
den Stream immer selbst:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Dieser Ansatz ist für mich verlockend, es auszuprobieren, da ich keine potenziellen Fehler sehe, die es haben könnte. Ich habe diesen Ansatz jedoch noch nie in einer Bibliothek gesehen (wahrscheinlich, weil nach dem Erscheinen von Java 8 nicht mehr viele Bibliotheken veröffentlicht wurden), daher habe ich etwas Angst, ihn zu übernehmen. Bestehende Bibliotheksklassen geben normalerweise Sammlungen zurück, wenn sie etwas vom privaten Zustand ableiten.
Gibt es etwas Schlimmes, das passieren könnte, wenn ich mich entscheide, einen Stream zurückzugeben, wo immer mein Java-8-Vorgänger eine Collection zurückgeben würde? Oder mache ich hier wahrscheinlich ein Gegenmuster mit all dem, was aus dem Privatstaat stammt?