1
votes

Comment passer une référence de méthode avec un paramètre en Java?

Je ne connais pas le nom exact (je suppose une référence à une méthode) mais voici de quoi je parle. Disons que je veux prendre la racine carrée de tous les doubles dans un double tableau. Ensuite, si le tableau s'appelle arr , je peux faire ceci:

Arrays.stream(arr).map(Math::pow(2)). // ... box it and stuff

Cependant, si je veux mettre au carré chaque nombre dans un tableau int, je pense d'utiliser Math.pow (num, 2) comme méthode. Cependant, Math.pow a un deuxième paramètre, mais je sais que ce sera toujours 2. Donc je pense que je peux faire quelque chose comme ça:

Arrays.stream(arr).map(Math::sqrt). // ... box it and stuff

Mais cela entraîne une erreur. Que puis-je faire?


7 commentaires

Je pense que vous avez deux façons: - Écrivez un amusement avec 1 param (num), puis retournez Math.pow (num, 2), utilisez ce fun pour référence de méthode. - utilisez simplement it * it pour la fonction square on map sans référence de méthode.


Vous ne pouvez pas utiliser une référence de méthode ici, utilisez simplement un lambda à la place. .mapToDouble (n -> Math.pow (n, 2))


La référence de méthode ne fonctionne que si la méthode a le même paramètre d'entrée + type de retour avec la méthode principale de l'interface fonctionnelle cible ( geeksforgeeks.org/functional-interfaces-java )


Je veux dire, si vous utilisez Math.pow (num, 2) directement, il ne peut pas être référencé, si vous écrivez une autre méthode qui a 1 paramètre et retourne un double, cette méthode peut être référencée dans ce cas, je vais vous montrer le code si nécessaire.


Ou parlez-vous de application partielle ? (ce qui, dans ce cas, serait exagéré)


@FedericoklezCulloca non, je veux juste expliquer comment la référence de méthode fonctionne au demandeur.


@ThinkTwiceCodeOnce désolé pour la confusion, ce commentaire était destiné à OP.


3 Réponses :


1
votes

Vous pouvez utiliser une expression lambda simple.

Arrays.stream(arr).map(d -> Math.pow(d, 2));


0 commentaires

3
votes

vous pouvez utiliser lambda et envoyer Math.pow (n, 2)

comme ceci:

Stream.of(1.1,1.2,1.3).map(n -> Math.pow(n,2))


2 commentaires

Savez-vous comment passer une référence de méthode au lieu d'utiliser un lambda? Je me demande simplement si c'est possible, car je pense que cela donne un aspect plus propre.


@Higigig non, cela ne rendrait pas le code plus propre. Cela donnerait un aspect différent, c’est tout.



0
votes

Il y a 2 façons de mettre en œuvre ceci:

  • Tout d'abord, utilisez l'expression lambda:

    Arrays.stream(arr).map(this::square);
    
    
    private double square(double num) {
        return Math.pow(num, 2);
    }
    
  • Deuxièmement, (si vous voulez toujours invoquer une référence de méthode ici, et comprendre correctement le fonctionnement de la référence de méthode): écrivez une autre méthode qui appelle Math.pow ():

    Arrays.stream(arr).map(num -> Math.pow(num, 2));
    


0 commentaires