Ich spiele mit Java 8 herum, um herauszufinden, wie es als erstklassige Bürger funktioniert. Ich habe das folgende Snippet:
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);
}
}
Ich versuche, Methode displayIntan Methode unter myForEachVerwendung einer Methodenreferenz zu übergeben. Der Compiler erzeugt den folgenden Fehler:
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
Der Compiler beschwert sich darüber void cannot be converted to Void. Ich weiß nicht, wie ich den Typ der Funktionsschnittstelle in der Signatur angeben soll myForEach, damit der Code kompiliert wird. Ich weiß , ich könnte einfach den Rückgabetyp ändern von displayIntzu Voidund dann zurück null. Es kann jedoch Situationen geben, in denen es nicht möglich ist, die Methode zu ändern, die ich an eine andere Stelle übergeben möchte. Gibt es eine einfache Möglichkeit zur Wiederverwendung displayInt?
Blockwurde fürConsumerin den neuesten Versionen der JDK 8 API geändert