Je joue avec Java 8 pour découvrir comment fonctionne en tant que citoyen 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 en myForEach
utilisant une référence de méthode. Le compilateur génère 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 s'en plaint void cannot be converted to Void
. Je ne sais pas comment spécifier le type de l'interface de fonction dans la signature de myForEach
telle sorte que le code se compile. Je sais que je pourrais simplement changer le type de retour de displayInt
à Void
, puis revenir 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 quel?
Block
été changé pour lesConsumer
dernières versions de l'API JDK 8