Rumah  >  Artikel  >  Java  >  Streams dan Lambdas dalam Java: Panduan Pengaturcaraan Fungsional dengan Contoh

Streams dan Lambdas dalam Java: Panduan Pengaturcaraan Fungsional dengan Contoh

王林
王林asal
2024-08-16 10:31:35470semak imbas

Streams and Lambdas in Java: A Guide to Functional Programming with Examples

Pengaturcaraan fungsional ialah pendekatan yang digunakan secara meluas dalam pembangunan perisian moden. Java, sebagai bahasa yang menyokong pengaturcaraan berorientasikan objek dan berfungsi, memperkenalkan aliran dan lambda dalam versi ke-8nya. Ciri ini membolehkan pembangun menggunakan gaya berfungsi pada koleksi, menjadikan operasi pada koleksi lebih cekap dan bersih.

Strim di Jawa
Aliran di Java mengubah koleksi menjadi aliran elemen. Ia membolehkan pembangun melaksanakan operasi berfungsi pada koleksi seperti pemetaan, penapisan dan pengurangan. Strim paling baik digunakan untuk operasi yang melibatkan transformasi, pengagregatan atau penapisan data.

Contoh penggunaan strim ialah mengisih senarai nama dalam susunan abjad. Kami boleh membuat senarai nama dan kemudian menggunakan strim untuk mengisih mereka seperti yang ditunjukkan di bawah:

Senaraikan nama = Arrays.asList("John", "Mary", "David", "Emily", "Tom");
names.stream().sorted().forEach(System.out::println); //output: David, Emily, John, Mary, Tom

Di sini, kami telah mencipta aliran menggunakan kaedah stream() pada senarai. Kami kemudiannya telah menggunakan kaedah sorted() untuk mengisih elemen dalam aliran dalam susunan semula jadi. Akhir sekali, kaedah forEach() digunakan untuk mencetak setiap elemen dalam strim.

Lambdas di Jawa
Lambdas digunakan untuk mentakrifkan fungsi kelas pertama dalam Java. Fungsi ini boleh menggunakan elemen daripada aliran dan melakukan operasi padanya. Lambdas ditakrifkan di luar kelas dan boleh dihantar sebagai argumen kepada fungsi.

Untuk menggunakan lambdas dengan strim, kita perlu memahami konsep antara muka berfungsi. Ini adalah antara muka yang mempunyai hanya satu kaedah abstrak. Ungkapan Lambda boleh digunakan untuk menyediakan pelaksanaan konkrit bagi kaedah abstrak antara muka berfungsi.

Isih senarai nama menggunakan lambdas
Berdasarkan contoh di atas, mari kita susun nama dalam tertib menurun menggunakan lambdas.

Senaraikan nama = Arrays.asList("John", "Mary", "David", "Emily", "Tom");
names.stream().sorted((a, b) -> b.compareTo(a)).forEach(System.out::println)); //output: Tom, Mary, John, Emily, David

Di sini, kami telah menggunakan ungkapan lambda sebagai hujah kepada kaedah sorted(). Fungsi lambda ini menerima dua hujah (a dan b) dan membandingkannya, mengembalikan nilai positif, negatif atau sifar berdasarkan perbandingan. Ini membolehkan kami mengisih elemen dalam tertib menurun dengan menggunakan kaedah compareTo() pada elemen.

Tukarkan strim kembali kepada koleksi
Dalam sesetengah kes, kami mungkin mahu menukar strim kembali kepada koleksi selepas melakukan operasi padanya. Kita boleh melakukan ini menggunakan kaedah collect(), yang mengambil objek Collector sebagai hujah.

Senaraikan filteredNames = names.stream()
.filter(name -> name.length() > 4) //simpan hanya nama dengan panjang > 4
.collect(Collectors.toList()); //kembali senarai nama yang ditapis

Kaedah collect() mengambil antara muka berfungsi jenis Collector dan menggunakannya untuk mengumpul elemen ke dalam koleksi. Dalam contoh di atas, kami telah menggunakan kaedah toList() daripada kelas Collectors untuk membuat senarai nama yang ditapis.

Operasi lain pada strim
Selain daripada pengisihan dan penapisan, terdapat operasi lain yang boleh dilakukan pada strim seperti pemetaan, pengurangan dan lelaran. Operasi ini membolehkan kami mengubah, mengurangkan dan melelakan elemen dalam strim masing-masing.

Peta dan kurangkan aliran nombor
Katakan kita mempunyai senarai nombor dan kita ingin mencari jumlah semua nombor genap. Kita boleh melakukan ini menggunakan kaedah map() dan reduce().

Senaraikan nombor = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.stream()
.filter(num -> num % 2 == 0) //tapis keluar nombor ganjil
.map(num -> num * 2) //gandakan nombor genap
.reduce(0, (a, b) -> a + b); //tambah semua nombor bersama

Di sini, kami telah menggunakan kaedah map() untuk menggandakan nombor genap dalam aliran dan kemudian menggunakan kaedah reduce() untuk menambah semua nombor bersama-sama. Hasilnya ialah jumlah semua nombor genap dalam senarai.

Gunakan semula operasi pada strim
Dalam sesetengah kes, kami mungkin perlu menggunakan operasi berfungsi yang sama pada berbilang strim. Untuk mengelakkan menulis kod yang sama berulang kali, kami boleh mencipta antara muka berfungsi dan menyampaikannya sebagai hujah kepada kaedah.

Mari kita ambil contoh mengisih senarai nama mengikut nama keluarga. Kita boleh mencipta kelas pembanding yang melaksanakan antara muka Pembanding dan menyampaikannya sebagai hujah kepada kaedah sorted().

kelas statik LastNameComparator melaksanakan Comparator {
@Override
public int compare(String name1, String name2) {
Rentetan[] bahagian1 = nama1.split(" ");
String lastName1 = bahagian1[parts1.length - 1];
Rentetan[] bahagian2 = nama2.split(" ");
String lastName2 = bahagian2[bahagian2.panjang - 1];
kembalikan lastName2.compareTo(lastName1);
}
}

names.stream().sorted(new LastNameComparator()).forEach(System.out::println); //output: Emily, David, John, Mary, Tom

Di sini, kami telah menyerahkan LastNameComparator sebagai hujah kepada kaedah sorted() untuk mengisih nama mengikut nama keluarga.

Kesimpulan
Strim dan lambda di Java menyediakan cara yang berkuasa dan cekap untuk melaksanakan operasi berfungsi pada koleksi. Mereka membolehkan pembangun menulis kod yang bersih, ringkas dan boleh digunakan semula. Dengan memahami konsep strim dan lambda, kami boleh meningkatkan kemahiran pengekodan keseluruhan kami dan menulis kod yang lebih cekap.

Satu kaedah berkesan untuk meningkatkan kemahiran Java anda ialah dengan mendapatkan Pensijilan Java terkini dan menggunakan Ujian Amalan 1Z0-830 yang tersedia di MyExamCloud.

Atas ialah kandungan terperinci Streams dan Lambdas dalam Java: Panduan Pengaturcaraan Fungsional dengan Contoh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn