Als ich Java SE 8 Gold studierte, war es ein komplizierter Ort, also habe ich ihn zusammengefasst. Es berührt auch funktionale Schnittstellen anderer primitiver Spezialtypen. Hinweis) Inhalt für Goldprüfer
Die Regel, die dieses Problem löst, ist ** "Eine funktionale Schnittstelle mit einem Rückgabetyp ist die entsprechende Methode = Basismethode + As + Rückgabetyp" ** Es ist in einem Wort zusammengefasst.
Es ist ein Wort mit Implikationen, dass Sie mehr über die Funktionsoberfläche in java.util.function erfahren können (ich habe es selbst gemacht), also lasst es uns entwirren.
Zunächst die Grundlagen der Grundlagen. Wenn Sie sich nicht daran erinnern, ist es ziemlich schwierig, Gold zu bekommen. Im Gegenteil, wenn Sie das wissen, können Sie die Hälfte des vorherigen Satzes verstehen.
Grundlegende funktionale Schnittstelle | Methode | Erläuterung |
---|---|---|
Consumer<T> | void accept(T) | Erhält Argumente, verarbeitet und gibt keine Ergebnisse zurück. "Verbraucher" |
Function<T,R> | R apply(T t) | Erhält ein Argument und den angegebenen Typ(R)Gibt das Ergebnis von zurück "wird bearbeitet" |
Predicate<T> | boolean test(T t) | Nehmen Sie ein Argument und bewerten Sie es mit einem booleschen Wert. "Bejahung" |
Supplier<T> | T get() | Gibt nur das Ergebnis ohne Argumente zurück. "Lieferant" |
Im Rückblick auf die vorherige Regel heißt es übrigens: "Der Rückgabetyp wurde als einer festgelegt."
Bitte schauen Sie sich die Tabelle oben genauer an.
Geben Sie überhaupt keinen Rückgabewert zurück
Sie müssen sich nicht für die Art des Rückgabewerts entscheiden
Sie werden feststellen, dass es eine funktionale Schnittstelle gibt.
Ersteres ist "Consumer
In der Java SE-API-Dokumentation für java.util.function gibt es funktionale Schnittstellen wie IntConsumer und IntPredicate, primitive Spezialtypen wie IntFunction. Gibt es dann Methoden wie acceptAsInt und testAsInt wie applyAsInt?
Die Antwort ist nein.
** Das Problem sind diesmal die verwandten Methoden von Funktion \ <T, R > und Lieferant \ <T > ** Bitte beachten Sie zunächst. (In Golds Problem werden acceptAsInt und testAsInt nicht einmal als Optionen angezeigt.)
Kommen wir hier zum Hauptthema zurück. Ist die Methode von IntFunction, die eine primitive spezialisierte Art von Funktionsschnittstelle ist, nur anwenden oder anwenden als ... Wie Sie beim Lesen der Regeln sehen können, ist der Punkt "ob der Rückgabewert eingegeben ist" Dies lässt sich an der Definition der Funktionsschnittstelle bis hin zu den Generika ablesen. Es gibt drei Grundmuster für funktionsbezogene primitive Spezialtypen. Lassen Sie uns diese hier überprüfen.
IntFunction<R>
ToIntFunction<T>
DoubleToIntFunction
Eine grobe Zusammenfassung der Beziehung zwischen der Bedeutung der oben genannten Generika und den Arten von Argumenten und Rückgabewerten
<R>: Der Rückgabetyp kann beliebig festgelegt werden (Argument ist int type)
<T>: Der Argumenttyp kann beliebig festgelegt werden (Rückgabewert ist int type)
Keine Generika: Sowohl Argumente als auch Rückgabewerte sind vom festen Typ (Argumente sind vom doppelten Typ, Rückgabewert ist vom Typ int)
Wird sein.
Mit anderen Worten, die IntFunction-Methode des Titels kann den Rückgabetyp beliebig bestimmen, es handelt sich also nur um "Apply"
ToIntFunction und DoubleToIntFunction sind applyAsInt
, da der Rückgabetyp durch den int-Typ bestimmt wird.
Natürlich folgen andere DoubleFunctions (die Methode ist anwendbar), ToDoubleFunction (die Methode ist applyAsDouble) usw. denselben Regeln.
Betrachten wir nun die IntSupplier-Methode. Da die IntFunction-Methode nur angewendet wurde Sie könnten denken, dass die IntSupplier-Methode nur ein Get ist. ** Lass dich nicht täuschen **
Sie müssen sich daran erinnern, wer der Lieferant war. Lieferant \ <T > war ein "Lieferant", der keine Argumente entgegennahm und nur das Ergebnis zurückgab. Mit anderen Worten, da die lieferantenbezogene Funktionsschnittstelle keine Argumente enthält, kann der Teil des primitiven Spezialtyps IntSupplier, der als Int-Typ bestimmt wird, nur der Rückgabewert sein.
Infolgedessen ist die entsprechende Methode von "IntSupplier" getAsInt ". ** Umgekehrt wird die entsprechende Methode nur in Supplier \ <T > im Supplier-System abgerufen. ** ** ** ~~ (Ich persönlich möchte die Generika von Supplier \ <T > auf R setzen) ~~
(1) BiFunction, (2) BinaryOperator, (3) IntBinaryOperator, (4) IntUnaryOperator, (5) ToDoubleBiFunction, welche Methoden sind jeweils anwendbar?
Erstens sind ① bis ⑤ spezielle Arten von Funktionen. Daher ist der grundlegende Methodenteil von "~ entsprechende Methode = grundlegende Methode + As + Rückgabetyp" "Übernehmen".
①BiFunction
Wenn Sie die Definition bis zu Generika schreiben, BiFunction <T, U, R>
Einfach ausgedrückt, eine Version mit zwei weiteren Argumenten für die Funktion \ <T, R >.
Da der Rückgabewert nicht festgelegt ist, lautet die entsprechende Methode "Apply" (es gibt jedoch zwei Argumente).
②BinaryOperator
Wenn Sie die Definition bis zu Generika schreiben, BinaryOperator <T>
Einfach ausgedrückt ist es eine funktionale Schnittstelle, wenn die beiden Argumente von BiFunction und der Rückgabetyp alle gleich sind.
Synonym für BiFunction \ <T, T, T >.
Da der Rückgabewert nicht festgelegt ist, lautet die entsprechende Methode "Apply" (es gibt jedoch zwei Argumente).
③IntBinaryOperator
Eine Version von BinaryOperator, deren zwei Argumente und Rückgabewert vom Typ int sind.
Da der Rückgabewert vom Typ int bestimmt wird, lautet die entsprechende Methode applyAsInt
(zwei Argumente sind ebenfalls vom Typ int).
④IntUnaryOperator
Erstens ist UnaryOperator <T>
eine Funktionstypschnittstelle, wenn das Funktionsargument und der Rückgabetyp identisch sind.
Synonym für Funktion \ <T, T >.
Die Version des unären Operators, deren Argumente und Rückgabewert beide vom Typ int sind.
Da der Rückgabewert durch den Typ int bestimmt wird, lautet die entsprechende Methode applyAsInt
(Argument ist auch int type)
⑤ToDoubleBiFunction
Wenn Sie die Definition bis zu Generika schreiben, ToDoubleBiFunction <T, U>
Da entschieden wird, dass nur der Rückgabewert ein Doppeltyp ist, lautet die entsprechende Methode "applyAsDouble" (es gibt jedoch zwei Argumente).
Ich habe bisher geschrieben, aber wenn ich es implementiere, erhalte ich einen Kompilierungsfehler, sodass ich nicht über eine so verwirrende Sache nachdenken muss. Ich hoffe, dieser Artikel hat Ihnen geholfen, Golds Prüfungen zu studieren und das Paket java.util.function zu verstehen.
Hinweis zur Verwendung der Funktionsoberfläche unter java.util.function java.util.function (Java Platform SE 8 )
Recommended Posts