Je m'amuse avec Java 8 pour découvrir comment les fonctions sont des citoyens de première classe. J'ai l'extrait suivant :
package test;
import java.util.*;
import java.util.function.*;
public class Test {
public static void myForEach(List<Integer> list, Function<Integer, Void> myFunction) {
list.forEach(functionToBlock(myFunction));
}
public static void displayInt(Integer i) {
System.out.println(i);
}
public static void main(String[] args) {
List<Integer> theList = new ArrayList<>();
theList.add(1);
theList.add(2);
theList.add(3);
theList.add(4);
theList.add(5);
theList.add(6);
myForEach(theList, Test::displayInt);
}
}
Ce que j'essaie de faire, c'est de passer la méthode displayInt
à la méthode myForEach
en utilisant une méthode de référence. Le compilateur produit l'erreur suivante :
src/test/Test.java:9: error: cannot find symbol
list.forEach(functionToBlock(myFunction));
^
symbol: method functionToBlock(Function<Integer,Void>)
location: class Test
src/test/Test.java:25: error: method myForEach in class Test cannot be applied to given ty
pes;
myForEach(theList, Test::displayInt);
^
required: List<Integer>,Function<Integer,Void>
found: List<Integer>,Test::displayInt
reason: argument mismatch; bad return type in method reference
void cannot be converted to Void
Le compilateur se plaint que void cannot be converted to Void
. Je ne sais pas comment spécifier le type de l'interface de la fonction dans la signature de la fonction myForEach
de sorte que le code se compile. Je sais que je pourrais simplement changer le type de retour de displayInt
a Void
et retourner ensuite null
. Cependant, il peut y avoir des situations où il n'est pas possible de modifier la méthode que je veux passer ailleurs. Existe-t-il un moyen simple de réutiliser displayInt
tel qu'il est ?