Nelle librerie lambda-pesanti pre-Java 8 come Guava, le uscite utilizzano interfacce comuni di Java Collection Framework, quindi è facile passarle a API esterne / interne e sfruttare ancora un calcolo pigro se il metodo della libreria lo esegue (ad esempio, pigro filter()
e transform()
).
Tuttavia, in Java 8 Stream, la chiamata per ottenere un Collection
/ Map
è terminale (cioè desiderosa) e assegnerà anche nuove strutture dati per contenere i risultati.
Per calcoli complicati con più stadi e pattern di strategia nel mezzo, questo causa molte allocazioni non necessarie a causa dei risultati intermedi.
Quindi, le persone pensano che sia una buona pratica per le API interne (ad esempio strategie di strategia) prendere e restituire Stream
s o dovrei semplicemente ricorrere alle API guava pigre ma non ottimizzate (gioco di parole immagino)?
Modifica:
La mia preoccupazione principale con Stream
è che può essere consumata solo una volta e il passaggio di qualcosa come Supplier<Stream<X>>
sembra estremamente complicato. Ti spinge quasi a passare solo un Collection
e poi re stream()
(e pagando il costo di una valutazione entusiasta a quel punto).