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 displayInt
an Methode unter myForEach
Verwendung 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 displayInt
zu Void
und 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
?
Block
wurde fürConsumer
in den neuesten Versionen der JDK 8 API geändert