Tôi đang chơi xung quanh với Java 8 để tìm hiểu chức năng của các công dân hạng nhất. Tôi có đoạn trích sau:
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);
}
}
Những gì tôi đang cố gắng làm là truyền phương thức displayInt
cho phương thức myForEach
bằng cách sử dụng tham chiếu phương thức. Để trình biên dịch tạo ra lỗi sau:
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
Trình biên dịch phàn nàn rằng void cannot be converted to Void
. Tôi không biết cách chỉ định loại giao diện chức năng trong chữ ký myForEach
sao cho mã biên dịch. Tôi biết tôi chỉ đơn giản là có thể thay đổi kiểu trả về của displayInt
để Void
và sau đó trở về null
. Tuy nhiên, có thể có những tình huống không thể thay đổi phương pháp tôi muốn vượt qua ở một nơi khác. Có một cách dễ dàng để tái sử dụng displayInt
như nó là?
Block
đã được thay đổiConsumer
trong các bản phát hành mới nhất của API JDK 8