Estoy jugando con Java 8 para descubrir cómo funciona como ciudadanos de primera clase. Tengo el siguiente fragmento:
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);
}
}
Lo que intento hacer es pasar método displayInt
a método myForEach
utilizando una referencia de método. Al compilador produce el siguiente error:
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
El compilador se queja de eso void cannot be converted to Void
. No sé cómo especificar el tipo de interfaz de función en la firma de myForEach
tal manera que el código se compila. Sé que podría simplemente cambiar el tipo de retorno de displayInt
a Void
y luego regresar null
. Sin embargo, puede haber situaciones en las que no sea posible alterar el método que quiero pasar a otro lugar. ¿Hay una manera fácil de reutilizar displayInt
como es?
Block
se cambió para lasConsumer
últimas versiones de la API JDK 8