Di Java 8, metode dapat dibuat sebagai ekspresi Lambda dan dapat dilewatkan dengan referensi (dengan sedikit kerja di bawah tenda). Ada banyak contoh online dengan lambdas yang dibuat dan digunakan dengan metode, tetapi tidak ada contoh bagaimana membuat metode menggunakan lambda sebagai parameter. Apa sintaks untuk itu?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Jawaban:
Lambdas murni merupakan konstruksi situs-panggilan: penerima lambda tidak perlu tahu bahwa Lambda terlibat, melainkan menerima Antarmuka dengan metode yang sesuai.
Dengan kata lain, Anda mendefinisikan atau menggunakan antarmuka fungsional (yaitu antarmuka dengan metode tunggal) yang menerima dan mengembalikan apa yang Anda inginkan.
Untuk Java 8 ini hadir dengan serangkaian tipe antarmuka yang umum digunakan
java.util.function
(terima kasih kepada Maurice Naftalin untuk petunjuk tentang JavaDoc).Untuk kasus penggunaan khusus ini ada
java.util.function.IntBinaryOperator
dengan satuint applyAsInt(int left, int right)
metode , sehingga Anda bisa menulis Andamethod
seperti ini:Tapi Anda bisa mendefinisikan antarmuka Anda sendiri dan menggunakannya seperti ini:
Menggunakan antarmuka Anda sendiri memiliki keuntungan bahwa Anda dapat memiliki nama yang lebih jelas menunjukkan maksudnya.
sumber
(int a, int b, int c)
untukTwoArgIntOperator
. Apa yang terjadi jikaTwoArgIntOperator
memiliki dua metode dengan tanda tangan yang sama. Jawaban ini membingungkan.Untuk menggunakan ekspresi Lambda Anda perlu membuat antarmuka fungsional Anda sendiri atau menggunakan antarmuka fungsional Java untuk operasi yang membutuhkan dua integer dan kembali sebagai nilai. IntBinaryOperator
Menggunakan antarmuka fungsional yang ditentukan pengguna
Menggunakan antarmuka fungsional Java
Contoh lain yang saya buat ada di sini
sumber
IntBinaryOperator
dokumentasi sudah mati.Untuk fungsi yang tidak memiliki lebih dari 2 parameter, Anda dapat meneruskannya tanpa mendefinisikan antarmuka Anda sendiri. Sebagai contoh,
Di
BiFunction<Integer, String, List<String>>
,Integer
danString
parameternya, danList<String>
merupakan tipe pengembaliannya.Untuk fungsi dengan hanya satu parameter, Anda dapat menggunakan
Function<T, R>
, di manaT
jenis parameternya, danR
merupakan jenis nilai pengembaliannya. Lihat halaman ini untuk semua antarmuka yang sudah disediakan oleh Java.sumber
Ada versi yang dapat diakses publik dari Java 8 JavaDocs yang diaktifkan Lambda, ditautkan dari http://lambdafaq.org/lambda-resources . (Ini jelas merupakan komentar atas jawaban Joachim Sauer, tetapi saya tidak dapat masuk ke akun SO saya dengan poin reputasi yang perlu saya tambahkan komentar.) Situs lambdafaq (saya pertahankan) menjawab ini dan banyak Jawa lainnya pertanyaan -lambda.
NB Jawaban ini ditulis sebelum dokumentasi Java 8 GA tersedia untuk umum . Tapi saya tetap di tempat, karena FAQ Lambda mungkin masih bermanfaat bagi orang yang mempelajari tentang fitur yang diperkenalkan di Java 8.
sumber
Bagi saya, solusi yang paling masuk akal adalah mendefinisikan
Callback
antarmuka:dan kemudian menggunakannya sebagai parameter dalam fungsi yang ingin Anda panggil:
Hanya presisi saja
Lambda bukanlah antarmuka khusus, kelas atau apa pun yang Anda dapat mendeklarasikan sendiri.
Lambda
hanya nama yang diberikan ke() -> {}
sintaks khusus, yang memungkinkan keterbacaan yang lebih baik ketika melewati antarmuka metode tunggal sebagai parameter. Itu dirancang untuk menggantikan ini:Jadi dalam contoh di atas,
Callback
adalah tidak lambda, itu hanya antarmuka biasa;lambda
adalah nama sintaks pintasan yang dapat Anda gunakan untuk mengimplementasikannya.sumber
Bagi siapa pun yang mencari Google ini, metode yang baik adalah menggunakan
java.util.function.BiConsumer
. ex:Hasil cetakannya adalah: 166
sumber
Consumer<Pair<A,B>>
, gunakanBiConsumer<A,B>
untuk kasus ini. ( docs )Ekspresi Lambda dapat dilewatkan sebagai argumen. Untuk meneruskan ekspresi lambda sebagai argumen, tipe parameter (yang menerima ekspresi lambda sebagai argumen) harus dari tipe antarmuka fungsional.
Jika ada antarmuka fungsional -
Dan ada metode filter yang menambahkan int dalam daftar hanya jika lebih besar dari 5. Perhatikan di sini bahwa metode filter memiliki antarmuka funtional IMyFunc sebagai salah satu parameter. Dalam kasus itu, ekspresi lambda dapat dilewatkan sebagai argumen untuk parameter metode.
sumber
Anda dapat menggunakan antarmuka fungsional seperti yang disebutkan di atas. di bawah ini adalah beberapa contohnya
Semoga ini bisa membantu
sumber
Yah, itu mudah. Tujuan dari ekspresi lambda adalah untuk mengimplementasikan Antarmuka Fungsional. Ini adalah antarmuka dengan hanya satu metode.Berikut adalah artikel awesone tentang antarmuka fungsional yang telah ditentukan dan sebelumnya.
Bagaimanapun, jika Anda ingin mengimplementasikan antarmuka fungsional Anda sendiri, buatlah. Sebagai contoh sederhana:
Jadi mari kita buat kelas, di mana kita akan membuat metode, yang menerima jenis MyFunctionalInterface :
Hal terakhir yang harus Anda lakukan adalah meneruskan implementasi MyFunctionalInterface ke metode yang telah kami tentukan:
Itu dia!
sumber
Lambda bukan objek tetapi Antarmuka Fungsional. Satu dapat mendefinisikan sebanyak Antarmuka Fungsional karena mereka dapat menggunakan @FuntionalInterface sebagai anotasi
Outputnya adalah sebagai berikut
Konsep dasar dari Ekspresi Lambda adalah untuk mendefinisikan logika Anda sendiri tetapi Argumen yang sudah didefinisikan. Jadi dalam kode di atas Anda dapat mengubah definisi fungsi do dari penambahan ke definisi lain, tetapi argumen Anda terbatas pada 2.
sumber
Pada dasarnya untuk meneruskan ekspresi lamda sebagai parameter, kita memerlukan tipe yang bisa kita gunakan. Sama seperti nilai integer yang kami pegang dalam kelas primitif int atau Integer. Java tidak memiliki tipe terpisah untuk ekspresi lamda melainkan menggunakan antarmuka sebagai tipe untuk menahan argumen. Tetapi antarmuka itu harus merupakan antarmuka fungsional .
sumber
Lakukan yang berikut ..
Anda telah mendeklarasikan.
method(lambda l)
Yang ingin Anda lakukan hanyalah membuat Interface dengan namalambda
dan mendeklarasikan satu metode abstraknama metode tidak masalah di sini ..
Jadi ketika Anda memanggil
MyClass.method( (a,b)->a+b)
implementasi ini(a,b)->a+b
akan disuntikkan ke antarmuka Anda menambahkan metode. Jadi setiap kali Anda menyebutnyal.add
akan mengambil implementasi ini dan melakukan penambahana
danb
danreturn l.add(2,3)
akan kembali5
. - Pada dasarnya inilah yang dilakukan lambda ..sumber
Berikut kira-kira bagaimana C # menangani masalah ini (tetapi dinyatakan sebagai kode Java). Sesuatu seperti ini dapat menangani hampir semua kebutuhan Anda:
sumber
Ada fleksibilitas dalam menggunakan lambda sebagai parameter. Ini memungkinkan pemrograman fungsional dalam java. Sintaks dasarnya adalah
Berikut ini caranya, Anda dapat mendefinisikan metode yang menggunakan antarmuka fungsional (lambda digunakan) sebagai parameter. Sebuah. jika Anda ingin mendefinisikan metode yang dideklarasikan di dalam antarmuka fungsional, katakanlah, the antarmuka fungsional diberikan sebagai argumen / parameter ke metode yang dipanggil dari
main()
Di atas menjelaskan penggunaan ekspresi lambda tertentu, ada lebih banyak. ref Java 8 lambda dalam lambda tidak dapat mengubah variabel dari lambda luar
sumber