[JAVA] La méthode de la fonction primitive spécialisée IntFunction s'applique-t-elle ou applyAsInt?

introduction

Quand j'étudiais Java SE 8 Gold, c'était un endroit compliqué, alors je l'ai résumé. Il aborde également les interfaces fonctionnelles d'autres types spéciaux primitifs. Note) Contenu pour les candidats Gold

En fait, il peut être résolu en un mot

La règle qui résout ce problème est ** "Une interface fonctionnelle avec un type de retour est la méthode correspondante = méthode de base + As + type de retour" ** Il se résume en un mot.

C'est un mot avec des implications que vous pouvez apprendre sur l'interface fonctionnelle dans java.util.function (je l'ai fait moi-même), alors découvrons-le.

Correspondance entre l'interface de type de fonction de base fournie par java.util.function et la méthode

Tout d'abord, les bases des bases. Si vous ne vous en souvenez pas, il est assez difficile d'obtenir de l'or. Au contraire, si vous savez cela, vous pouvez comprendre la moitié de la phrase précédente.

Interface fonctionnelle de base Méthode La description
Consumer<T> void accept(T) Reçoit les arguments, traite et ne renvoie pas de résultats,
"consommateur"
Function<T,R> R apply(T t) Reçoit un argument et le type spécifié(R)Renvoie le résultat de
"En traitement"
Predicate<T> boolean test(T t) Prenez un argument et évaluez-le avec une valeur booléenne,
"Affirmation"
Supplier<T> T get() Renvoie uniquement le résultat sans prendre d'arguments,
"Fournisseur"

L'histoire de la prémisse qui peut être comprise d'ici

En passant, en regardant la règle précédente, il est dit: «Le type de retour a été décidé comme étant un». Veuillez regarder de plus près le tableau ci-dessus. Ne renvoyez pas de valeur de retour en premier lieu '' Vous n'avez pas à décider du type de valeur de retour '' Vous remarquerez qu'il existe une interface fonctionnelle. Le premier est Consumer <T> '' et le second est Predicate ''. Qu'adviendra-t-il de ces deux?

En regardant la documentation de l'API Java SE pour java.util.function, il existe des interfaces fonctionnelles telles que IntConsumer et IntPredicate, qui sont des types spécialisés primitifs tels que IntFunction. Ensuite, existe-t-il des méthodes telles que acceptAsInt et testAsInt comme applyAsInt?

La réponse est non.

** Le problème cette fois, ce sont les méthodes associées de Fonction \ <T, R > et Fournisseur \ <T > ** Tout d'abord, gardez à l'esprit. (Dans le problème de Gold, acceptAsInt et testAsInt n'apparaissent même pas comme des options.)

Essayez de résoudre le problème du titre

Revenons au sujet principal ici. Est la méthode de IntFunction, qui est un type spécialisé primitif d'interface Function, il suffit d'appliquer ou de applyAsInt ... Comme vous pouvez le voir en lisant les règles, le point est `` si la valeur de retour est tapée. '' Cela peut être vu en regardant la définition de l'interface fonctionnelle jusqu'aux génériques. Il existe trois modèles de base pour les types spécialisés primitifs liés à la fonction, nous allons donc les vérifier ici.

IntFunction<R>
ToIntFunction<T>
DoubleToIntFunction

Un résumé approximatif de la relation entre la signification des génériques ci-dessus et les types d'arguments et de valeurs de retour <R>: Le type de retour peut être décidé arbitrairement (l'argument est de type int) '' : le type d'argument peut être décidé arbitrairement (la valeur de retour est de type int) '' `` Pas de génériques: les arguments et les valeurs de retour sont de type fixe (les arguments sont de type double, la valeur de retour est de type int) '' Sera.

En d'autres termes, la méthode IntFunction du titre peut décider arbitrairement du type de la valeur de retour, il s'agit donc simplement de ʻapply`` Étant donné que le type de retour de ToIntFunction et DoubleToIntFunction est déterminé par le type int, il devient ʻapplyAsInt``.

Bien entendu, les autres DoubleFunctions (la méthode s'applique), ToDoubleFunction (la méthode est applyAsDouble), etc. suivent les mêmes règles.

Quelle est la méthode IntSupplier?

Considérons maintenant la méthode IntSupplier. Étant donné que la méthode IntFunction était juste appliquée Vous pourriez penser que la méthode IntSupplier est juste un get. ** Ne soyez pas dupe **

Vous devez vous rappeler qui était le fournisseur. Le fournisseur \ <T > était un "fournisseur" qui n'a accepté aucun argument et n'a renvoyé que le résultat. En d'autres termes, puisqu'il n'y a pas d'arguments dans l'interface fonctionnelle liée au fournisseur, la partie du type spécialisé primitif IntSupplier qui est déterminée comme étant de type int ne peut être que la valeur de retour.

En conséquence, la méthode correspondante de `ʻIntSupplier est getAsInt``. ** Inversement, la méthode correspondante est obtenue uniquement dans Supplier \ <T > dans le système Supplier. ** ** ~~ (Personnellement, je veux définir les génériques de Supplier \ <T > sur R) ~~

Problème d'application

(1) BiFunction, (2) BinaryOperator, (3) IntBinaryOperator, (4) IntUnaryOperator, (5) ToDoubleBiFunction, quelles sont les méthodes correspondantes?

Premièrement, ① à ⑤ sont des types spécialisés de Fuction. Par conséquent, la partie méthode de base de «~ méthode correspondante = méthode de base + As + type de retour» est «appliquer».

①BiFunction Si vous écrivez la définition jusqu'aux génériques, BiFunction <T, U, R> '' En termes simples, une version avec deux arguments supplémentaires pour Function \ <T, R \>. Puisque la valeur de retour n'est pas fixe, la méthode correspondante est `ʻapply (cependant, il y a deux arguments)

②BinaryOperator Si vous écrivez la définition jusqu'aux génériques, BinaryOperator <T> '' En termes simples, il s'agit d'une interface fonctionnelle lorsque les deux arguments de BiFunction et le type de retour sont tous les mêmes. Synonyme de BiFunction \ <T, T, T \>. Puisque la valeur de retour n'est pas fixe, la méthode correspondante est `ʻapply (cependant, il y a deux arguments)

③IntBinaryOperator Une version de BinaryOperator dont les deux arguments et la valeur de retour sont de type int. Puisque la valeur de retour est déterminée par le type int, la méthode correspondante est `ʻapplyAsInt`` (deux arguments sont également de type int).

④IntUnaryOperator Premièrement, «Opérateur unaire » est une interface de type de fonction lorsque l'argument et le type de retour de la fonction sont identiques. Synonyme de Function \ <T, T >. La version de l'opérateur unaire dont les arguments et la valeur de retour sont tous deux de type int. Puisque la valeur de retour est déterminée par le type int, la méthode correspondante est `ʻapplyAsInt`` (l'argument est également le type int).

⑤ToDoubleBiFunction Si vous écrivez la définition jusqu'aux génériques, ToDoubleBiFunction <T, U> '' Puisqu'il est décidé que seule la valeur de retour est un type double, la méthode correspondante est `ʻapplyAsDouble (cependant, il y a deux arguments)

finalement

J'ai écrit jusqu'à présent, mais quand je l'implémente, j'obtiens une erreur de compilation, donc je ne devrais pas avoir à penser à une chose aussi déroutante. J'espère que cet article vous a aidé à étudier les examens Gold et à comprendre le package java.util.function.

référence

Remarque sur l'utilisation de l'interface de fonction ci-dessous java.util.function java.util.function (Java Platform SE 8 )

Recommended Posts

La méthode de la fonction primitive spécialisée IntFunction s'applique-t-elle ou applyAsInt?
L'ordre des modificateurs de méthode Java est fixe
La question de savoir quel est le meilleur, si ou changer
La spécification d'autorisation de la méthode FileUtils est un nombre octal.
Java: dont le problème est plus rapide, en flux ou en boucle
Quelle est la méthode d'initialisation?
Qu'est-ce que @Override ou @SuppressWarnings ("SleepWhileInLoop") devant la fonction? ?? ??
Quel est le plus rapide, taille ou 0, comme argument de List # toArray?
Méthode d'enquête lorsque le processeur du serveur exécutant java est lourd
'% 02d' Quel est le% de% 2?
À propos du rôle de la méthode initialize
Quel type de méthode est define_method?
[Rails] Concernant la présence ou l'absence de parenthèses dans l'argument de la méthode de rendu
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
Quelle est la méthode principale en Java?
Quelle est la structure des données d'ActionText?
J'ai approfondi ma compréhension de la méthode de fusion
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?