일급 시민으로서 어떻게 기능하는지 알아보기 위해 Java 8을 가지고 놀고 있습니다. 다음 스 니펫이 있습니다.
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);
}
}
내가하려고하는 것은 메소드 참조를 사용하여 메소드 displayInt
를 메소드에 전달하는 것 myForEach
입니다. 컴파일러에서 다음과 같은 오류가 발생합니다.
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
컴파일러는 그것을 불평합니다 void cannot be converted to Void
. myForEach
코드가 컴파일되도록 서명에서 함수 인터페이스 유형을 지정하는 방법을 모르겠습니다 . 나는 단지의 반환 형식을 변경할 수 있습니다 알고 displayInt
에 Void
다음 반환 null
. 그러나 다른 곳으로 전달하려는 방법을 변경할 수없는 상황이있을 수 있습니다. 그대로 재사용하는 쉬운 방법 displayInt
이 있습니까?
Block
변경되었습니다Consumer