Antarmuka fungsional adalah antarmuka yang hanya memiliki satu metode abstrak, tetapi dapat memiliki beberapa metode non-abstrak.
Antarmuka fungsional dapat secara implisit dikonversi ke ekspresi Lambda.
Antarmuka fungsional dapat mendukung Lambdas Friendly oleh fungsi yang ada.
memperkenalkan
Antarmuka fungsional sebenarnya merupakan kelas antarmuka abstrak. Antarmuka fungsional berikut telah ditemukan sebelum Java 8.
java.lang.runnablejava.util.concurrent.callablejava.util.comparator
dll...
Cara menggunakan
Faktanya, kelas antarmuka yang disebutkan di atas hanya perlu dimodifikasi dengan anotasi fungsionalInterface, dan menjadi antarmuka fungsional di Java. Misalnya, definisi antarmuka yang dapat dipanggil di JDK
@FunctionInterfacepublic Interface Callable <V> {v Call () melempar Exception;}Sesederhana itu.
Sekarang mari kita bicara tentang antarmuka fungsi baru yang ditambahkan ke Java 8. Ini definisinya
// t adalah parameter yang masuk // r adalah parameter pengembalian @functionalInterfacepublic Function <t, r> {r Apply (t t); Fungsi default <v> <v, r> compose (function <? super v,? Extends t> sebelum {objects.requirenonnull (sebelum); return (v v) -> apply (sebelum.Apply (v));} default <v> function <t, v> dan dari function (function <? super r,? Extends v> afters) {Objects. After.Apply (Terapkan (T));Ini dapat dipahami sebagai penunjuk fungsi dalam bahasa C (pendapat pribadi).
Dalam penggunaan aktual, metode Apply banyak digunakan. Compose/and Then sebagian besar digunakan dalam skenario di mana lebih dari dua antarmuka fungsi dan urutan eksekusi dilakukan.
Dalam kode bisnis tertentu, saya biasanya menggunakannya dalam kombinasi dengan bifuncton/pemasok. BiFunction mendukung 2 parameter, fungsi hanya mendukung satu parameter. Pemasok dapat digunakan untuk menyimpan nilai -nilai yang diperlukan tertentu dan mendapatkannya.
contoh
Referensi ke kode yang biasanya Anda kerjakan. Contoh ini terutama menghindari beberapa kondisi penilaian yang jika menyebabkan kode membengkak. Pada saat yang sama, logika bisnis yang sama dapat diabstraksi dari antarmuka fungsi, sehingga kode dapat digunakan kembali di banyak tempat. Kode spesifiknya adalah sebagai berikut.
Function<Object, Integer> actionTest1 = (object) -> { // logic return 0;};Function<Object, Integer> actionTest2 = (object) -> { // logic return 0;};public Supplier<Map<Integer, Function<Object, Integer>>> actionSupplier = () -> { Map<Integer, Function<Object, Integer>> maps = new Hashmap <> (); peta.put (1, actionTest1); peta.put (2, actionTest2); peta pengembalian;}; // Gunakan tes public void (tipe int, objek objek) {opsional.ofnullable (actionupplier.get (). get (type)). ifpresent (x -> x.apply (v, objek)); // if/else Logic if (type == 1) {// test1 logika} else if (type == 2) {// test2 logika}}Meringkaskan
Secara pribadi, saya percaya bahwa dalam skenario di mana ada lebih banyak penilaian pada cabang logika bisnis, lebih cocok untuk menggunakan fungsi, dan ada manfaat berikut.
Contoh Antarmuka Fungsional
Antarmuka predikat <T> adalah antarmuka fungsional yang menerima parameter input T dan mengembalikan hasil boolean.
Antarmuka ini berisi berbagai metode default untuk menggabungkan predikat ke dalam logika kompleks lainnya (seperti: versus, atau, non).
Antarmuka ini digunakan untuk menguji objek itu benar atau salah.
Kita dapat memahami penggunaan predikat antarmuka fungsional <T> melalui contoh berikut (java8tester.java):
Java8tester.java file impor java.util.arrays; import java.util.list; import java.util.function.predicate; kelas publik java8tester {public static void main (string args []) {list <integer> list = arrays.aslist (1, 2, 3, 4, 5, 6, 7, 8, 9); // predikat <Integer> predikat = n -> true // n adalah metode uji yang meneruskan argumen ke antarmuka predikat // n jika ada, metode pengujian mengembalikan sistem true.out.println ("Keluar semua data:"); // Lewati parameter n eval (daftar, n-> true); // predikat <Integer> predict1 = n -> n%2 == 0 // n adalah metode uji yang meneruskan parameter ke antarmuka predikat // jika n%2 adalah 0 metode uji mengembalikan sistem true.out.println ("out semua angka genap:"); eval (daftar, n-> n%2 == 0); // Predikat <Integer> prediksi2 = n -> n> 3 // n adalah metode uji yang meneruskan parameter ke antarmuka predikat // jika n lebih besar dari 3 metode uji mengembalikan sistem true.out.println ("output semua angka lebih besar dari 3:"); eval (daftar, n-> n> 3); } public static void eval (daftar <integer> daftar, predikat <Integer> prediksi) {for (integer n: list) {if (predicate.test (n)) {system.out.println (n + ""); }}}}Jalankan skrip di atas dan hasil output adalah:
$ javac java8tester.java
$ java java8tester
Output semua data:
1
2
3
4
5
6
7
8
9
Output semua angka genap:
2
4
6
8
Output semua angka lebih besar dari 3:
4
5
6
7
8
9
Meringkaskan
Di atas adalah antarmuka fungsional fungsional Java 8 dan contoh antarmuka fungsional yang diperkenalkan oleh editor. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!