2016-05-18 27 views
8

Sono nuovo di Java 8, mi sono imbattuto in Consumer java doc e dice: "Il consumatore dovrebbe funzionare tramite effetti collaterali". Qualcuno potrebbe spiegare perché è stato detto così?Java 8 Consumer ed effetti collaterali

+3

Se non sei abituato alla programmazione funzionale, quella lingua non significa molto per te. L'idea è che le funzioni "pure" dovrebbero solo leggere dai loro input e scrivere solo sui loro valori di ritorno (quindi non ci saranno effetti collaterali - l'unico effetto dell'esecuzione della funzione è che si ottiene il valore di ritorno.) Funzioni che cambiano qualcosa (modificare una struttura dati, eseguire IO, ecc.), si dice che abbia effetti collaterali. Una funzione senza un valore di ritorno avrebbe avuto effetti collaterali migliori, oppure non sta facendo nulla. –

risposta

4

In base allo Consumer javadoc, un consumatore deve essere dichiarato con un metodo con la firma void accept(T). Di conseguenza, il metodo non può restituire un valore. Se non avesse un effetto collaterale, non avrebbe alcuna possibilità di eseguire alcun effetto.

+0

Grazie. Ho capito il tuo punto. – user6348242

0

La maggior parte delle interfacce funzionali è pensata per essere proprio quella - funzionale interfacce, che significa in sostanza che accettano un input, eseguono alcuni calcoli e restituiscono un output. Non dovrebbero modificare alcun stato. Consumer è l'eccezione perché non restituisce alcun valore; il suo scopo è solo quello di modificare alcuni stati.

7

dei consumatori ha metodo accept con la seguente firma

void accept(T t); 

Il metodo prende t come input e non restituisce nulla (void), e quindi non è possibile restituire nulla da esso e sostituire il metodo chiama con il valore che restituisce.

Un esempio di un effetto collaterale sarebbe una dichiarazione di stampa,

list.stream.foreach(System.out::println); 

foreach prende un consumatore come argomento. Se ci pensi, l'unica cosa utile che potresti fare con un tale metodo è cambiare il mondo (cioè, mutare uno stato).

L'opposto che avrebbe un pure function, una funzione che non mutare qualsiasi stato, ci vuole un input e restituisce qualcosa, per esempio

Function<Integer,Integer> fn = x -> x*x; 

fn qui non ha effetti collaterali (non muta nulla), riceve un numero intero e restituisce pacificamente il suo quadrato.

Problemi correlati