W bibliotekach ciężkich przed biblioteką Java 8, takich jak Guava, dane wyjściowe używają wspólnych interfejsów Java Collection Framework, więc łatwo jest przekazać je zewnętrznym / wewnętrznym interfejsom API i nadal wykorzystywać leniwe obliczenia, jeśli metoda biblioteczna to robi (np. Leniwa filter()
i transform()
).
Jednak w strumieniach Java 8 wezwanie do uzyskania Collection
/ Map
jest terminalem (tzn. Chętnym), a także przydzieli nowe struktury danych do przechowywania wyników.
W przypadku skomplikowanych obliczeń z wieloma etapami i wzorcem strategii pośrodku powoduje to wiele niepotrzebnych alokacji z powodu wyników pośrednich.
Czy ludzie uważają więc, że dobrą praktyką jest przyjmowanie i zwracanie wewnętrznych interfejsów API (tj. Strategii wzorców strategii), Stream
czy też powinienem powrócić do leniwych, ale nie usprawnionych (zgaduję, że tak jest), interfejsów API Guava?
Edytować:
Moim głównym zmartwieniem Stream
jest to, że można go spożywać tylko raz, a przekazywanie czegoś takiego Supplier<Stream<X>>
wygląda na wyjątkowo niewygodne. Prawie popycha cię to tylko do zaliczenia, Collection
a następnie cofnięcia stream()
go (i zapłacenia w tym momencie kosztów niecierpliwości).