2016-05-18 16 views
8

Ich bin neu in Java 8, stieß ich auf Consumer Java Doc und es heißt: "Consumer wird erwartet, über Nebenwirkungen zu arbeiten." Könnte jemand bitte erklären, warum es so gesagt wird?Java 8 Verbraucher und Nebenwirkungen

+3

Wenn Sie mit der funktionalen Programmierung nicht vertraut sind, wird Ihnen diese Sprache nicht viel bedeuten. Die Idee ist, dass "reine" Funktionen nur von ihren Eingaben lesen und nur auf ihre Rückgabewerte schreiben sollten (damit es keine Nebenwirkungen gibt - der einzige Effekt der Ausführung der Funktion ist, dass Sie den Rückgabewert erhalten.) Funktionen, die sich ändern etwas (ändern Sie eine Datenstruktur, laufen IO, usw.), werden gesagt, um Nebenwirkungen zu haben. Eine Funktion ohne Rückgabewert hätte besser Nebenwirkungen, sonst macht sie nichts. –

Antwort

4

Gemäß der Consumer javadoc muss ein Verbraucher mit einer Methode mit der Signatur void accept(T) deklariert werden. Daher kann die Methode keinen Wert zurückgeben. Wenn es keine Nebenwirkung hätte, hätte es keinerlei Auswirkungen.

+0

Danke. Ich habe dich verstanden. – user6348242

0

Die meisten funktionalen Schnittstellen sind nur so konzipiert, dass sie eine Eingabe akzeptieren, einige Berechnungen durchführen und eine Ausgabe zurückgeben. Sie sollen keinen Zustand ändern. Consumer ist die Ausnahme, weil es keine Werte zurückgibt; Ihr Zweck besteht lediglich darin, einen Staat zu verändern.

7

Consumer hat Methode accept mit der folgenden Signatur

void accept(T t); 

Verfahren t als eine Eingabe nimmt und nichts zurückgibt (void), und damit kann man nichts von ihr zurückzukehren und das Verfahren ersetzen rufe mit dem Wert auf, den es zurückgibt.

Ein Beispiel für einen Nebeneffekt würde eine print-Anweisung nimmt

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

foreach Consumer als Argument. Wenn Sie darüber nachdenken, ist die einzige nützliche Sache, die Sie mit einer solchen Methode tun können, die Welt zu verändern (dh einen Zustand mutieren).

Das Gegenteil davon wäre ein pure function, eine Funktion, die keinen Staat nicht mutiert, ist es eine Eingabe nimmt und gibt etwas, zum Beispiel

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

fn hier keine Nebenwirkungen hat (es mutiert nichts), es erhält eine Ganzzahl und gibt sein Quadrat friedlich zurück.

Verwandte Themen