Di Jawa, mungkinkah lambda menerima berbagai jenis?
Yaitu: Variabel tunggal berfungsi:
Function <Integer, Integer> adder = i -> i + 1;
System.out.println (adder.apply (10));
Varargs juga berfungsi:
Function <Integer [], Integer> multiAdder = ints -> {
int sum = 0;
for (Integer i : ints) {
sum += i;
}
return sum;
};
//....
System.out.println ((multiAdder.apply (new Integer [] { 1, 2, 3, 4 })));
Tetapi saya menginginkan sesuatu yang dapat menerima berbagai jenis argumen, misalnya:
Function <String, Integer, Double, Person, String> myLambda = a , b, c, d-> {
[DO STUFF]
return "done stuff"
};
Penggunaan utama adalah memiliki fungsi inline kecil di dalam fungsi untuk kenyamanan.
Saya telah melihat-lihat google dan memeriksa Paket Fungsi Java, tetapi tidak dapat menemukannya. Apakah ini mungkin?
Function<One, Function<Two, Function<Three, Function<Four, Function<Five, Six>>>>> func = a -> b -> c -> d -> e -> 'z';
Function
yang bentrok denganjava.util.function.Function<T,R>
yang mungkin tidak jelas untuk pemula.Untuk sesuatu dengan 2 parameter, Anda dapat menggunakan
BiFunction
. Jika Anda membutuhkan lebih banyak, Anda dapat mendefinisikan antarmuka fungsi Anda sendiri, seperti:Jika ada lebih dari satu parameter, Anda harus meletakkan tanda kurung di sekitar daftar argumen, seperti:
sumber
Untuk kasus ini, Anda bisa menggunakan antarmuka dari pustaka default (java 1.8):
Ada contoh kecil (bukan yang terbaik) dari metode default di antarmuka:
sumber
Untuk memanfaatkan lambda: Ada tiga jenis operasi:
1. Terima parameter -> Konsumen
2. Uji parameter pengembalian boolean -> Predikat
3. Manipulasi parameter dan nilai balik -> Fungsi
Java Fungsional antarmuka hingga dua parameter:
antarmuka parameter tunggal Fungsi Predikat
Konsumen Dua antarmuka parameter BiConsumer BiPredicate BiFunction
Untuk lebih dari dua , Anda harus membuat antarmuka fungsional sebagai berikut (Jenis konsumen):
sumber
Alternatif lain, tidak yakin apakah ini berlaku untuk masalah khusus Anda tetapi untuk beberapa itu mungkin berlaku adalah untuk digunakan
UnaryOperator
di perpustakaan java.util.function. di mana ia mengembalikan tipe yang sama yang Anda tentukan, jadi Anda menempatkan semua variabel Anda dalam satu kelas dan apakah itu sebagai parameter:Jadi kelas yang Anda miliki, dalam hal ini
Person
, dapat memiliki banyak variabel instan dan tidak perlu mengubah parameter ekspresi lambda Anda.Bagi yang berminat, saya telah menulis catatan tentang cara menggunakan perpustakaan java.util.function: http://sysdotoutdotprint.com/index.php/2017/04/28/java-util-function-library/
sumber
Anda juga bisa menggunakan perpustakaan jOOL - https://github.com/jOOQ/jOOL
Ini sudah menyiapkan antarmuka fungsi dengan berbagai parameter. Misalnya, Anda dapat menggunakan
org.jooq.lambda.function.Function3
, dll dariFunction0
hinggaFunction16
.sumber