Java Lambda Expressions adalah fitur baru yang diperkenalkan oleh Java 8. Mereka dapat dikatakan sebagai gula sintaks untuk pemrograman fungsional yang disimulasikan. Mereka mirip dengan penutupan di JavaScript, tetapi mereka agak berbeda. Tujuan utamanya adalah untuk memberikan sintaks fungsional untuk menyederhanakan pengkodean kami.
Sintaks Dasar Lambda
Struktur dasar lambda adalah (argumen) -> tubuh, dan ada beberapa situasi:
Tubuh perlu menyertakan pernyataan dengan {}, dan {} dapat dihilangkan ketika hanya ada satu pernyataan.
Metode penulisan umum adalah sebagai berikut:
(a) -> a * a
(int a, int b) -> a + b
(a, b) -> {return a - b;}
() -> System.out.println (thread.currentThread (). GetId ())
FungsionalInterface
konsep
Ekspresi Java Lambda didasarkan pada antarmuka fungsional. Apa itu antarmuka fungsional? Sederhananya, ini adalah antarmuka dengan hanya satu metode (fungsi). Tujuan dari jenis antarmuka ini adalah untuk operasi tunggal, yang setara dengan fungsi tunggal. Antarmuka umum seperti runnable dan pembanding adalah antarmuka fungsional, dan dijelaskan dengan @FunctionalInterface.
Berikan contoh
Mudah dimengerti menggunakan utas sebagai contoh. Antarmuka runnable adalah antarmuka yang biasa digunakan saat kami pemrograman utas, yang mencakup metode void run (), yang merupakan logika yang berjalan utas. Menurut sintaks sebelumnya, kami biasanya menggunakan kelas anonim runnable untuk membuat utas baru, sebagai berikut:
utas baru (runnable baru () {@Override public void run () {System.out.println (thread.currentThread (). getId ());}}). start ();Jika Anda menulis terlalu banyak, bukankah itu membosankan? Aturan penulisan berdasarkan lambda menjadi ringkas dan jelas, sebagai berikut:
utas baru (() -> System.out.println (thread.currentThread (). getId ())). start ();
Perhatikan parameter utas. Implementasi anonim Runnable diimplementasikan dalam satu kalimat, dan ditulis sebagai yang berikut untuk lebih memahami.
Runnable r = () -> System.out.println (thread.currentThread (). GetId ());
utas baru (r) .start ();
Tentu saja, tujuan Lambda bukan hanya untuk menulis secara ringkas, tetapi untuk meringkas tujuan tingkat yang lebih tinggi setelah memahaminya.
Mari kita lihat contoh lain dari pembanding. Menurut metode penulisan tradisional, sebagai berikut:
Integer [] a = {1, 8, 3, 9, 2, 0, 5}; arrays.sort (a, pembanding baru <Integer> () {@override public int perbandingan (integer o1, integer o2) {return o1 - o2;}});Ekspresi Lambda ditulis sebagai berikut:
Integer [] a = {1, 8, 3, 9, 2, 0, 5};
Arrays.sort (a, (o1, o2) -> o1 - o2);
Antarmuka fungsional di JDK
Agar perpustakaan kelas yang ada untuk secara langsung menggunakan ekspresi lambda, ada beberapa antarmuka di Java 8 yang telah ditandai sebagai antarmuka fungsional:
Paket baru java.util.function telah ditambahkan ke Java 8, membawa antarmuka fungsional yang umum digunakan:
In addition, more specific functions are added to the processing of basic types, including: BooleanSupplier, DoubleBinaryOperator, DoubleConsumer, DoubleFunction<R>, DoublePredicate, DoubleSupplier, DoubleToIntFunction, DoubleToLongFunction, DoubleToLongFunction, DoubleUnaryOperator, IntBinaryOperator, IntConsumer, IntFunction<R>, IntPredicate, IntSupplier, IntToDoubleFunction, IntToLongFunction, IntUnaryOperator, LongBinaryOperator, LongConsumer,LongFunction<R>, LongPredicate, LongSupplier, LongToDoubleFunction,LongToIntFunction, LongUnaryOperator, ToDoubleBiFunction<T, U>, ToDoubleFunction<T>,ToIntBiFunction<T, U>, ToIntFunction<T>, TOLONGBIFUNTION <T, U>, TOLONGFUNCTION <T>. Dikombinasikan dengan antarmuka fungsional di atas, Anda dapat melihat peran antarmuka sekilas melalui nama kelas antarmuka fungsional dasar ini.
Buat antarmuka fungsional
Terkadang kita perlu menerapkan antarmuka fungsional sendiri, dan metodenya sangat sederhana. Pertama, Anda harus memastikan bahwa antarmuka ini hanya dapat memiliki satu operasi fungsi, dan kemudian anotasi @FunctionalInterface pada jenis antarmuka.
Ketik derivasi
Derivasi tipe adalah dasar dari ekspresi lambda, dan proses derivasi tipe adalah proses kompilasi ekspresi lambda. Kode berikut adalah contoh:
Fungsi <string, integer> strtoint = str -> integer.parseint (str);
Selama kompilasi, proses derivasi tipe yang saya pahami adalah sebagai berikut:
Jenis target di sini adalah kunci, dan tanda tangan metode diperoleh melalui tipe target dan kemudian membandingkannya dengan ekspresi lambda.
Referensi metode
Dasar referensi metode (referensi metode) juga merupakan antarmuka fungsional, yang dapat secara langsung diimplementasikan sebagai antarmuka fungsional, memiliki fungsi yang sama dengan ekspresi lambda dan juga tergantung pada derivasi tipe. Referensi metode dapat dilihat sebagai penyederhanaan ekspresi Lambda yang hanya menyebut satu metode.
Sintaks yang dirujuk oleh metode ini adalah: Type :: MethodName atau Instancename :: MethodName, dan MethodName yang sesuai dengan konstruktor adalah baru.
Misalnya, contoh digunakan di atas:
Fungsi <string, integer> strtoint = str -> integer.parseint (str);
Referensi metode yang sesuai adalah
Fungsi <string, integer> strtoint = integer :: parseInt;
Menurut jenis metode, referensi metode terutama dibagi menjadi tipe berikut: Referensi metode konstruktor, referensi metode statis, referensi metode instan pada instance, referensi metode contoh pada jenis, dll.
Referensi Metode Konstruktor
Sintaksnya adalah: Type :: New. Misalnya, fungsi berikut adalah untuk mengubah string menjadi array
Metode Referensi Menulis
Fungsi <string, integer> strtoint = integer :: new;
Menulis Lambda
Fungsi <string, integer> strtoint = str -> new integer (str);
Tulisan tradisional
Function <string, integer> strtoint = fungsi baru <string, integer> () {@Override public integer apply (string str) {return new integer (str); }};
Referensi Konstruktor Array
Sintaksnya adalah: type [] :: baru. Misalnya, fungsi berikut adalah membangun array string dengan panjang yang ditentukan
Metode Referensi Menulis
Function <integer, string []> fixedArray = string [] :: new;
Metode Referensi Menulis
Function <integer, string []> fixedArray = length -> baru string [length];
Tulisan tradisional
Function <integer, string []> fixedArray = Fungsi baru <integer, string []> () {@Override public string [] Terapkan (panjang integer) {return new string [length]; }};Referensi metode statis
Sintaksnya adalah: Type :: New. Karena fungsi berikut juga digunakan untuk mengubah string menjadi array
Metode Referensi Menulis
Fungsi <string, integer> strtoint = integer :: parseInt;
Menulis Lambda
Fungsi <string, integer> strtoint = str -> integer.parseint (str);
Tulisan tradisional
Fungsi <string, integer> strtoint = fungsi baru <string, integer> () {@Override public integer apply (string str) {return integer.parseint (str); }};Referensi metode contoh pada suatu contoh
Sintaksnya adalah: Instancename :: MethodName. Misalnya, fungsi penilaian berikut digunakan untuk menentukan apakah ada nama yang diberikan dalam daftar
Daftar <string> names = arrays.aslist (string baru [] {"zhang san", "li si", "wang wu"});
Predikat <string> checknameExists = names :: contains;
System.out.println (checkNameExists.test ("Zhang San"));
System.out.println (checkNameExists.test ("Zhang SI"));
Referensi Metode Contoh pada Jenis
Sintaksnya adalah: type :: methodname. Referensi runtime mengacu pada objek dalam konteks, seperti fungsi di bawah ini untuk mengembalikan panjang string
Fungsi <String, Integer> calcStrlength = String :: length; System.out.println (calcStrlength.Apply ("Zhang San")); Daftar <String> names = arrays.aslist (string baru [] {"zhangsan", "lisi", "wangwu"}); name.sstream ().
Misalnya, fungsi berikut telah menentukan pemisah untuk membagi string menjadi array
Bifunction <string, string, string []> split = string :: split;
String [] names = split.Apply ("Zhangsan, Lisi, Wangwu", ",");
System.out.println (arrays.tostring (nama));
Stream objek
konsep
Apa itu Stream? Aliran di sini berbeda dari InputStream dan OutputStream di IO. Stream terletak di paket java.util.stream dan juga baru ditambahkan ke Java 8. Stream hanyalah satu set elemen yang mendukung operasi agregasi paralel serial, yang dapat dipahami sebagai versi yang ditingkatkan dari koleksi atau iterator. Apa itu operasi agregasi? Untuk memberikan contoh sederhana, yang umum termasuk rata -rata, maksimum, minimum, jumlah, sortir, penyaringan, dll.
Beberapa fitur Stream:
Pemrosesan tunggal. Setelah satu pemrosesan selesai, aliran saat ini ditutup.
Mendukung cara umum untuk mendapatkan stream dalam operasi paralel
Dapatkan dari Koleksi
Collection.stream ();
Collection.parallelstream ();
Pabrik Statis
Arrays.stream (array)
Stream.of (t…)
Intstream.range ()
Di sini kami hanya akan memberikan pengantar singkat untuk streaming, dan akan ada aplikasi spesifik di bawah ini. Jika Anda ingin berbicara tentang hubungan antara stream dan ekspresi lambda, sebenarnya tidak ada hubungan yang sangat dekat. Hanya saja ekspresi Lambda sangat memfasilitasi penggunaan aliran. Tanpa ekspresi lambda, sejumlah besar kelas anonim akan dihasilkan selama penggunaan aliran, yang sangat canggung.
Berikan contoh
Demo berikut bergantung pada objek karyawan dan objek daftar yang terdiri dari objek karyawan.
Karyawan kelas publik {nama string pribadi; seks string pribadi; usia int pribadi; Pegawai publik (nama string, string sex, int usia) {super (); this.name = name; this.sex = seks; this.age = usia; } public string getName () {return name; } public string getsex () {return sex; } public int getage () {usia kembali; } @Override public string toString () {stringBuilder builder = new stringBuilder (); builder.append ("Karyawan {name ="). Append (name) .Append (", sex ="). Append (sex) .Append (", usia ="). Append (usia) .Append ("}"); return builder.tostring (); }} Daftar <eployee> Karyawan = ArrayList baru <> (); karyawan. karyawan. Karyawan.Cetak semua karyawan
Koleksi menyediakan metode foreach bagi kami untuk mengoperasikan objek individual satu per satu.
karyawan.foreach (e -> system.out.println (e));
atau
karyawan.stream (). foreach (e -> system.out.println (e));
Urutkan berdasarkan usia
Collections.sort (karyawan, (e1, e2) -> e1.getage () - e2.getage ());
karyawan.foreach (e -> system.out.println (e));
atau
karyawan.stream (). disortir ((e1, e2) -> e1.getage () -e2.getage ()). foreach (e -> system.out.println (e));
Cetak karyawan wanita tertua
Max/Min mengembalikan elemen terbesar/min dalam kondisi penyortiran yang ditentukan
Karyawan MaxAgeFemaleEmployee = karyawan.stream () .filter (e -> "wanita" .Equals (e.getsex ())) .max ((e1, e2) -> e1.getage () -e2.getage ()) .get (); System.println (maxAgeFemaleeAreeMeAdeeAse);
Cetak karyawan laki -laki berusia lebih dari 20 tahun
menyaring elemen yang memenuhi kriteria
Karyawan.stream ()
.filter (e -> e.getage ()> 20 && "pria" .equals (e.getsex ())))
.foreach (e -> System.out.println (e));
Cetak dua karyawan pria tertua
Metode batas mencegat elemen terbatas
karyawan.stream () .filter (e -> "laki -laki" .Equals (e.getsex ())) .sorted ((E1, E2) -> e2.getage () -e1.getage ()) .Limit (2) .foreach (e -> System.out.println (E));
Cetak nama semua karyawan pria, gunakan, terpisah
Peta untuk membentuk aliran baru setelah menjalankan fungsi yang diberikan.
String MaleMreyeSnames = karyawan.stream () .map (e -> e.getname ()) .collect (collector.joinining (",")); System.out.println (MaleeMreynames);Informasi Statistik
Intsummarystatistics, DoublesummaryStatistics, LongsummaryStatistics berisi data ringkasan dalam aliran.
IntSummaryStatistics stat = employees.stream() .mapToInt(Employee::getAge).summaryStatistics();System.out.println("Total number of employees:" + stat.getCount());System.out.println("Maximum age:" + stat.getMax());System.out.println("Minimum age:" + stat.getMin ()); System.out.println ("Usia rata -rata:" + stat.getArmage ());Meringkaskan
Ekspresi Lambda memang dapat mengurangi banyak kode dan meningkatkan produktivitas. Tentu saja, ada kelemahan, yaitu ekspresi kompleks akan dapat dibaca dengan buruk, atau mungkin karena mereka tidak terlalu terbiasa. Jika Anda terbiasa, saya yakin Anda akan menyukainya. Semuanya memiliki dua sisi, itu tergantung pada bagaimana kita menyeimbangkan pro dan kontra, terutama dalam tim.
Di atas adalah informasi yang menyortir java8 javalambda. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs web ini!