[JAVA] Gilt die Methode der primitiven spezialisierten IntFunction oder applyAsInt?

Einführung

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

In der Tat kann es in einem Wort gelöst werden

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.

Entsprechung zwischen der von java.util.function und method bereitgestellten Schnittstelle für grundlegende Funktionstypen

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"

Die Geschichte der Prämisse, die von hier aus verstanden werden kann

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 " und letzteres ist "Prädikat ". Was wird mit diesen beiden passieren?

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

Versuchen Sie, das Titelproblem zu lösen

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.

Was ist die IntSupplier-Methode?

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

Anwendungsproblem

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

Schließlich

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.

Referenz

Hinweis zur Verwendung der Funktionsoberfläche unter java.util.function java.util.function (Java Platform SE 8 )

Recommended Posts

Gilt die Methode der primitiven spezialisierten IntFunction oder applyAsInt?
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
Die Frage, welche besser ist, ob oder wechseln
Die Berechtigungsspezifikation der FileUtils-Methode ist eine Oktalzahl.
Java: Das Problem ist schneller, Stream oder Loop
Was ist die Initialisierungsmethode?
Was ist @Override oder @SuppressWarnings ("SleepWhileInLoop") vor der Funktion? ?? ??
Was ist schneller, Größe oder 0, als Argument von List # toArray?
Untersuchungsmethode, wenn die CPU des Servers, auf dem Java ausgeführt wird, schwer ist
'% 02d' Was ist der% von% 2?
Informationen zur Rolle der Initialisierungsmethode
Was für eine Methode ist define_method?
[Rails] In Bezug auf das Vorhandensein oder Fehlen von Klammern im Argument der Rendermethode
Ab Java9 werden Klassenkonstruktoren, die primitiven Typen entsprechen, als veraltet markiert.
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Was ist die Hauptmethode in Java?
Wie ist die Datenstruktur von ActionText?
Vertiefte mein Verständnis der Zusammenführungsmethode
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?