S'il vous plaît soyez gentils avec moi.Que faisaient les programmeurs Java avant Java 8 s'ils voulaient passer une fonction?
J'entends Java 8 introduit lambdas. Mais avant cela, si vous vouliez faire circuler une fonction, disons, comme argument, qu'avez-vous fait?
Une façon je peux penser est de créer une interface unique méthode comme ceci:
public interface ISingleMethodInterface
{
bool Really(int n);
}
public bool GimmeFunction(ISingleMethodInterface interface, int n)
{
return interface.Really(n);
}
Mais c'est une application très limitée des fonctions comme des citoyens de première classe parce que:
Vous ne peut pas faire grand-chose d'autre que d'exécuter cette fonction ou de passer cet objet à une autre méthode. Avec les lambdas, vous pouvez composer. Par exemple vous pouvez nier que lambda comme ceci:
public bool GimmeLambdaAndIWillComputeItsInverse(Func<int, bool> predicate, int n) { return !predicate(n); }
Vous ne pouvez pas retourner lambdas ou leurs dérivés. Je veux dire, vous ne pouvez retourner ce même objet comme ceci:
// I know Java doesn't have Tuples but let's forget that for now public Tuple GimmeFunction(ISingleMethodInterface interface, int n) { return new Tuple { Item1 = interface, Item2 = n }; }
Avec lambdas, vous pouvez retourner les dérivés comme ceci:
public Func<int, bool> GetInverseFunction(Func<int, bool> predicate, int n) { return n => !predicate(n); }
Alors, qu'avez-vous fait si vous aviez besoin de faire quelque chose comme ça?
Exactement ce que vous décrivez, objets de commande. Si vous deviez les imbriquer pour la composabilité, qu'il en soit ainsi. –
C'est trop triste. Pauvre toi! :-) –
@SotiriosDelimanolis Si vous voulez mettre cela comme réponse, je peux le marquer comme le bon. –