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

11

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).

    
posta billc.cn 13.07.2015 - 12:25
fonte

1 risposta

3

Pigrizia in Java 8 Gli stream funzionano allo stesso modo di Iterables in Guava: devi passare l'Iterable per rimanere pigro e la valutazione avviene, una volta che hai creato una collezione da Iterator. Entrambi gli stream e gli iteratori possono essere consumati solo una volta.

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

Speriamo che, dal momento che Stream ora è un'interfaccia standard ufficiale Java, ci saranno sempre più altre librerie e funzioni che possono funzionare in modo efficiente sugli Stream direttamente.

    
risposta data 13.07.2015 - 21:09
fonte

Leggi altre domande sui tag