Java 8: buona pratica per trasmettere stream nelle API per operazioni pigre?


12

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 Streamo 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 Collectione poi ri- stream()esso (e pagando il costo della valutazione desiderosa a quel punto).


Cosa, Guava e gli amici non vengono aggiornati per sfruttare i flussi nativi?
Kilian Foth,

1
Avere interfacce che accettano e restituiscono flussi migliora davvero l'interoperabilità con le funzionalità di flusso standard. Ti consente di integrare le chiamate alla tua interfaccia in una pipeline di stream.
Philipp,

@KilianFoth Non esiste una versione di Guava da quasi un anno e ci sono molti articoli popolari sulla sostituzione delle cose lambda di Guava con Stream; tuttavia nessuno di essi affronta il fatto che le operazioni di raccolta di Guava possono essere avide o pigre.
billc.cn,

Risposte:


3

La pigrizia in Java 8 Streams funziona come una volta per Iterables in Guava: devi passare sull'Iterable per rimanere pigro e la valutazione avviene, una volta che hai creato una Collezione da Iterator. Sia gli stream che gli iteratori possono essere consumati una sola volta.

Quindi, per le interfacce del metodo, il modo più generale (che consente la pigrizia) è utilizzare l'interfaccia Stream (ogni volta che avresti usato Iterable prima). Come dice @Philipp, questo consente loro di essere utilizzati nelle pipeline di Stream.

Si spera, poiché Stream ora è un'interfaccia standard Java ufficiale, ci saranno sempre più altre librerie e funzioni che possono lavorare in modo efficiente direttamente sugli stream.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.