Saya bermain-main dengan Java 8 untuk mencari tahu bagaimana fungsinya sebagai warga negara kelas satu. Saya memiliki cuplikan berikut:
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);
}
}
Apa yang saya coba lakukan adalah meneruskan metode displayInt
ke metode myForEach
menggunakan referensi metode. Untuk mengkompilasi menghasilkan kesalahan berikut:
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
Kompiler mengeluh itu void cannot be converted to Void
. Saya tidak tahu bagaimana cara menentukan jenis antarmuka fungsi di tanda tangan myForEach
sedemikian rupa sehingga kode dikompilasi. Saya tahu saya bisa dengan mudah mengubah jenis kembali displayInt
ke Void
dan kemudian kembali null
. Namun, mungkin ada situasi di mana tidak mungkin untuk mengubah metode yang ingin saya sampaikan di tempat lain. Apakah ada cara mudah untuk menggunakannya kembali displayInt
?
Block
diubah untukConsumer
rilis terbaru JDK 8 API