Podczas opracowywania mojego interfejsu API, który nie jest powiązany z żadnym starszym kodem, często piszę metody, które są czysto strumieniowe przesyłaniem strumieniowym zakończone przez zbieranie wyników. Jak ten:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Teraz większość klientów tej klasy zwykle potrzebuje kolekcji (w tym przypadku ImmutableSet) do wyszukiwania elementów i iteracji nad nią, ale niektórzy klienci mogą skorzystać z posiadania strumienia, aby mogli nadać temu więcej operacji Przesyłaj strumieniowo bez potrzeby uzyskiwania nowego strumienia z kolekcji. Tak więc zwrócenie Strumienia daje clienom zestaw opcji, które mieliby, gdyby mieli właśnie Kolekcję (w końcu zawsze mogą collect()
sami Strumień:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
To podejście kusi mnie do wypróbowania, ponieważ nie widzę żadnych potencjalnych wad. Jednak nigdy nie widziałem takiego podejścia w żadnej bibliotece (prawdopodobnie dlatego, że nie było wielu bibliotek wydanych po pojawieniu się Javy 8), więc boję się go przyjąć. Istniejące klasy bibliotek zwykle zwracają Kolekcje, gdy wywodzą coś ze stanu prywatnego.
Czy może się zdarzyć coś złego, jeśli zdecyduję się zwrócić strumień wszędzie tam, gdzie moja jaźń wcześniejsza niż Java-8 zwróciłaby kolekcję? A może robię tu coś w rodzaju antypatternu z tym wszystkim, co pochodzi od państwa prywatnego?