2 votes

<html> <h1>Java - fonction en tant que paramètre</h1> </html>

J'ai lu la réponse suivante à propos du passage de fonction en tant que paramètre.

Cependant, je ne saisis pas l'idée. Ma fonction peut être n'importe quelle fonction : sin(x), cos(x), etc.

Comme je l'ai compris, je peux créer une interface, par exemple :

public interface functionI {

}

qui l'encadrerait.

Maintenant j'ai ma fonction :

    public void needToDo(functionI a, int x0Par, int hPar){
}

(needToDo, par exemple, doit substituer le x de la fonction par x0par et hPar, et trouver le maximum. Si j'ai sin(x), j'ai besoin de trouver le max de sin(x0Par) et sin(hPar).

Je n'ai pas compris comment l'utiliser dans ma fonction. Comment saurai-je quoi faire quand j'aurai la fonction, qui peut être n'importe quoi (polynomiale, sin(x), etc.)

5voto

Tom Points 13036

Quelque chose comme ça:

public interface Function1 {
    RESULT call(INPUT input);
}

public class Sin implements Function1 {
    public static final Sin instance = new Sin();
    private Sin() {
    }
    public Double call(Double x) {
        return Math.sin(x);
    }
}

public Double needToDo(Function1 aFunction, Double x0Par, Double hPar) {
   Double d1 = aFunction.call(x0Par);
   Double d2 = aFunction.call(hPar);
   return d1 > d2 ? d1 : d2;
}

public static void main(String[] args) {
    Double x0Par = 10.2;
    Double hPar = 1.9;
    Double ret = needToDo(Sin.instance, x0Par, hPar);
    System.out.println(ret);
}

3voto

Cyberfox Points 1053

Ça ne fonctionne pas tout à fait comme ça; vous ne pouvez pas passer des fonctions arbitraires en tant que paramètres en Java, au lieu de cela vous passez des objets qui ont des fonctions spécifiques, souvent au nom générique.

Vous pourriez donc définir une interface MathOperation, qui a une méthode execute, prenant un double et renvoyant un double.

public interface MathOperation {
  double execute(double x);
}

et ensuite vous pouvez créer

public class Sin implements MathOperation {
  public double execute(double x) { return Math.sin(x); }
}

et avoir une fonction qui l'utilise comme

public void needToDo(MathOperation op, double x) {
  System.out.println(op.execute(x));
}

Vous pourriez créer une fonction sur-le-champ pour needToDo comme

...
needToDo(new MathOperation() {
    public double execute(double x) { return x * 2.0; }
});
...

Mais vous ne pouvez pas passer Math.sin en tant que paramètre. Il existe des astuces de réflexion que vous pouvez faire, mais c'est un autre problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X