Als Nicht-Java-Programmierer, der Java lernt, lese ich gerade über Supplier
und Consumer
Schnittstellen. Und ich kann mich nicht um ihre Verwendung und Bedeutung kümmern. Wann und warum würden Sie diese Schnittstellen verwenden? Kann mir jemand ein einfaches Beispiel für Laien geben? Ich finde die Doc-Beispiele nicht prägnant genug für mein Verständnis.
99
Consumer
undSupplier
Sie können auch die Suche Tutorial fürConsumer
...Antworten:
Dies ist Lieferant:
Dies ist Verbraucher:
Für Laien ist ein Lieferant eine Methode, die einen bestimmten Wert zurückgibt (wie im Rückgabewert). Während ein Verbraucher eine Methode ist, die einen bestimmten Wert verbraucht (wie im Methodenargument) und einige Operationen an ihnen ausführt.
Diese werden sich in so etwas verwandeln:
Das grundlegende Beispiel für die Verwendung wäre:
Stream#forEach(Consumer)
Methode. Es wird ein Consumer benötigt, der das Element aus dem Stream verbraucht, auf dem Sie iterieren, und für jeden von ihnen eine Aktion ausführt. Drucken Sie sie wahrscheinlich aus.quelle
Der Grund, warum Sie Schwierigkeiten haben, die Bedeutung funktionaler Schnittstellen wie der in zu
java.util.function
verstehen, ist, dass die hier definierten Schnittstellen keine Bedeutung haben! Sie sind hauptsächlich vorhanden, um die Struktur darzustellen , nicht die Semantik .Dies ist für die meisten Java-APIs untypisch. Die typische Java-API, z. B. eine Klasse oder Schnittstelle, hat eine Bedeutung, und Sie können ein mentales Modell für das, was es darstellt, entwickeln und dieses verwenden, um die Operationen darauf zu verstehen. Betrachten Sie
java.util.List
zum Beispiel. AList
ist ein Container mit anderen Objekten. Sie haben eine Sequenz und einen Index. Die Anzahl der in der Liste enthaltenen Objekte wird von zurückgegebensize()
. Jedes Objekt hat einen Index im Bereich 0..size-1 (einschließlich). Das Objekt am Index i kann durch Aufrufen abgerufen werdenlist.get(i)
. Und so weiter.Die funktionalen Schnittstellen in
java.util.function
haben keine solche Bedeutung. Stattdessen handelt es sich um Schnittstellen, die lediglich die Struktur einer Funktion darstellen, z. B. die Anzahl der Argumente, die Anzahl der Rückgabewerte und (manchmal), ob ein Argument oder ein Rückgabewert ein Grundelement ist. Wir haben also so etwas wieFunction<T,R>
eine Funktion, die ein einzelnes Argument vom Typ T verwendet und einen Wert vom Typ R zurückgibt . Das ist es. Was macht diese Funktion? Nun, es kann alles ... solange es ein einzelnes Argument benötigt und einen einzelnen Wert zurückgibt. Aus diesem Grund ist die Angabe fürFunction<T,R>
kaum mehr als "Stellt eine Funktion dar, die ein Argument akzeptiert und ein Ergebnis erzeugt."Wenn wir Code schreiben, hat er eindeutig eine Bedeutung, und diese Bedeutung muss von irgendwoher kommen. Bei den Funktionsschnittstellen ergibt sich die Bedeutung aus dem Kontext, in dem sie verwendet werden. Die Schnittstelle
Function<T,R>
hat für sich genommen keine Bedeutung. In derjava.util.Map<K,V>
API gibt es jedoch Folgendes:(Platzhalter wurden der Kürze halber entfernt)
Ah, diese Verwendung
Function
ist als "Mapping-Funktion". Was macht das? Wenn in diesem Zusammenhangkey
nicht bereits in der Karte vorhanden ist, wird die Zuordnungsfunktion aufgerufen und der Schlüssel übergeben, und es wird erwartet, dass ein Wert erzeugt wird, und das resultierende Schlüssel-Wert-Paar wird in die Karte eingefügt.Sie können sich also nicht die Spezifikation
Function
(oder eine der anderen funktionalen Schnittstellen) ansehen und versuchen, zu erkennen, was sie bedeuten. Sie müssen sich ansehen, wo sie in anderen APIs verwendet werden, um zu verstehen, was sie bedeuten. Diese Bedeutung gilt nur für diesen Kontext.quelle
A
Supplier
ist eine Methode, die keine Argumente akzeptiert und einen Wert zurückgibt. Seine Aufgabe ist es buchstäblich, eine Instanz einer erwarteten Klasse bereitzustellen. Zum Beispiel ist jeder Verweis auf eine 'Getter'-Methode aSupplier
Die Instanzmethodenreferenz
myClass::getCount
ist eine Instanz vonSupplier<Integer>
.A
Consumer
ist eine Methode, die Argumente akzeptiert und nichts zurückgibt. Es wird wegen seiner Nebenwirkungen angerufen. In JavaConsumer
ist a eine Redewendung für einevoid
Methode. Setter-Methoden sind ein gutes Beispiel:Die Instanzmethodenreferenz
myClass::setCount
ist eine Instanz vonConsumer<Integer>
undIntConsumer
.A
Function<A,B>
ist eine Methode, die ein Argument eines Typs verwendet und ein anderes zurückgibt. Dies kann als "Transformation" bezeichnet werden. DasFunction<A,B>
nimmt einA
und gibt ein zurückB
. Bemerkenswert ist, dassA
die Funktion für einen bestimmten Wert von immer einen bestimmten Wert von zurückgeben sollteB
.A
undB
kann in der Tat der gleiche Typ sein, wie der folgende:Die Instanzmethodenreferenz
myClass:addTwo
lautet aFunction<Integer, Integer>
und aToIntFunction<Integer>
.Eine Klassenmethodenreferenz auf einen Getter ist ein weiteres Beispiel für eine Funktion.
Die Klassenmethodenreferenz
MyClass::getCount
ist eine Instanz vonFunction<MyClass,Integer>
undToIntFunction<MyClass>
.quelle
Warum sind Consumer / Supplier / andere funktionale Schnittstellen im Funktionspaket java.util.function definiert : Consumer und Supplier sind zwei von vielen der in Java 8 bereitgestellten integrierten funktionalen Schnittstellen. Der Zweck all dieser integrierten funktionalen Schnittstellen ist Bereitstellung einer fertigen "Vorlage" für funktionale Schnittstellen mit gemeinsamen Funktionsdeskriptoren (Signaturen / Definitionen für funktionale Methoden).
Nehmen wir an, wir müssen einen Typ T in einen anderen Typ R konvertieren. Wenn wir einen übergeben würden so definierte Funktion als Parameter an eine Methode übergeben würden, müsste diese Methode eine funktionale Schnittstelle definieren, deren funktionale / abstrakte Methode Parameter akzeptiert vom Typ T als Eingabe und gibt einen Parameter vom Typ R als Ausgabe an. Nun könnte es viele Szenarien wie diese geben, und die Programmierer würden am Ende mehrere funktionale Schnittstellen für ihre Anforderungen definieren. Um diese Art von Szenario zu vermeiden, die Programmierung zu vereinfachen und einen gemeinsamen Standard für die Verwendung von Funktionsschnittstellen einzuführen, wurden eine Reihe integrierter Funktionsschnittstellen wie Prädikat, Funktion, Verbraucher und Lieferant definiert.
Was macht Consumer? Die Consumer-Funktionsschnittstelle akzeptiert eine Eingabe, macht etwas mit dieser Eingabe und gibt keine Ausgabe aus. Seine Definition ist wie folgt (aus Java Source) -
Hier ist accept () die funktionale \ abstract-Methode, die eine Eingabe akzeptiert und keine Ausgabe zurückgibt. Wenn Sie also eine Ganzzahl eingeben möchten, tun Sie etwas damit ohne Ausgabe. Verwenden Sie statt der Definition Ihrer eigenen Schnittstelle eine Instanz von Consumer.
Was macht der Lieferant? Die funktionale Schnittstelle des Lieferanten nimmt keine Eingabe entgegen, sondern gibt eine Ausgabe zurück. Es ist wie folgt definiert (aus Java Source) -
Überall dort, wo Sie eine Funktion benötigen, die etwas zurückgibt, beispielsweise eine Ganzzahl, aber keine Ausgabe verwendet, verwenden Sie eine Instanz von Supplier.
Wenn mehr Klarheit und eine beispielhafte Verwendung der Benutzer- und Lieferantenschnittstellen erforderlich sind, können Sie meine Blog-Beiträge auf dieselbe verweisen - http://www.javabrahman.com/java-8/java-8-java-util- Funktion-Verbraucher-Tutorial-mit-Beispielen / und http://www.javabrahman.com/java-8/java-8-java-util-function-supplier-tutorial-with-examples/
quelle
1. Bedeutung
Sehen Sie meine Antworten auf meine Frage hier und auch eine andere hier , aber kurz gesagt, diese neuen Schnittstellen bieten Konventionen und Beschreibungen für alle (+ funky Methodenverkettung wie z
.forEach(someMethod().andThen(otherMethod()))
2. Unterschiede
Verbraucher : Nimmt etwas, tut etwas, gibt nichts zurück:
void accept(T t)
Lieferant: Nimmt nichts, gibt etwas zurück:
T get()
(Umkehrung des Verbrauchers, im Grunde eine universelle 'Getter'-Methode)3. Verwendung
Lieferant: Wrap repetitiver Code, z. B. Timing der Codeausführung
quelle
In Laienbegriffen,
Der Lieferant liefert Daten, ohne jedoch Daten zu verbrauchen. In Programmierbegriffen eine Methode, die kein Argument akzeptiert, sondern einen Wert zurückgibt. Es wird verwendet, um neue Werte zu generieren.
http://codedestine.com/java-8-supplier-interface/
Der Verbraucher verbraucht Daten und gibt keine Daten zurück. In Programmierbegriffen eine Methode, die mehrere Argumente akzeptiert und keinen Wert zurückgibt.
http://codedestine.com/java-8-consumer-interface/
quelle
Verbraucher und Lieferant sind die von Java bereitgestellten Schnittstellen. Der Verbraucher wird zum Durchlaufen der Listenelemente verwendet, und der Lieferant wird zum Bereitstellen von Lieferobjekten verwendet
Sie können mit Code-Demonstration leicht verstehen.
Verbraucher
Lieferant
quelle
Die einfachste Antwort kann sein:
Ein Verbraucher kann als Funktion <T, Void> angesehen werden. Ein Lieferant kann als Funktion <Void, T> angesehen werden.
quelle
Zusamenfassend,
stellt eine anonyme Funktion dar, die kein Argument akzeptiert und ein Ergebnis erzeugt.
stellt eine anonyme Funktion dar, die ein Argument akzeptiert und kein Ergebnis liefert.
Es gibt auch ein Prädikat . Das Prädikat stellt eine anonyme Funktion dar, die ein Argument akzeptiert und ein Ergebnis erzeugt.
quelle