Nelle librerie pre-Java 8 pesanti di lambda come Guava, gli output utilizzano interfacce Java Collection Framework comuni, quindi è facile passarle alle API esterne / interne e sfruttare comunque un calcolo pigro se il metodo della libreria lo fa (ad esempio pigro filter()
e transform()
).
Tuttavia, in Java 8 Streams, la chiamata per ottenere un Collection
/ Map
è terminale (cioè desideroso) e alloca anche nuove strutture di dati per contenere i risultati.
Per calcoli complicati con più fasi e modello di strategia nel mezzo, ciò causa molte allocazioni non necessarie a causa dei risultati intermedi.
Quindi, la gente pensa che sia una buona pratica per le API interne (cioè le strategie del modello di strategia) prendere e restituire Stream
o dovrei semplicemente ricadere sulle API Guava Guazy pigre ma non ottimizzate (gioco di parole inteso)?
Modificare:
La mia principale preoccupazione Stream
è che può essere consumato solo una volta e passare qualcosa di simile a un Supplier<Stream<X>>
aspetto estremamente ingombrante. Ti spinge quasi solo a passare un Collection
e poi ri- stream()
esso (e pagando il costo della valutazione desiderosa a quel punto).