1. Gambaran keseluruhan
map () dan flatMap () API berasal dari bahasa berfungsi. Di Java 8, anda boleh menemuinya di Opsional, Stream dan di CompletableFuture (walaupun dengan nama yang sedikit berbeza).
Aliran mewakili urutan objek, sedangkan pilihan adalah kelas yang mewakili nilai yang boleh ada atau tidak ada. Di antara operasi agregat lain, kami mempunyai kaedah peta () dan flatMap () .
Walaupun kedua-duanya mempunyai jenis pengembalian yang sama , ia sangat berbeza. Mari jelaskan perbezaan ini dengan menganalisis beberapa contoh aliran dan pilihan.
2. Peta dan Peta Ringkas dalam Opsyen
Kaedah peta () berfungsi dengan baik dengan Pilihan - jika fungsi mengembalikan jenis tepat yang kita perlukan:
Optional s = Optional.of("test"); assertEquals(Optional.of("TEST"), s.map(String::toUpperCase));
Namun, dalam kes yang lebih kompleks kita mungkin diberi fungsi yang mengembalikan Pilihan juga. Dalam kes seperti itu, menggunakan peta () akan menyebabkan struktur bersarang, karena implementasi peta () melakukan pembungkus tambahan secara dalaman.
Mari kita lihat contoh lain untuk mendapatkan pemahaman yang lebih baik mengenai keadaan ini:
assertEquals(Optional.of(Optional.of("STRING")), Optional .of("string") .map(s -> Optional.of("STRING")));
Seperti yang kita dapat lihat, kita berakhir dengan struktur bersarang Pilihan
Itulah yang dapat dilakukan oleh flatMap () :
assertEquals(Optional.of("STRING"), Optional .of("string") .flatMap(s -> Optional.of("STRING")));
3. Peta dan Peta Diri dalam Aliran
Kedua-dua kaedah berfungsi sama untuk Pilihan .
Kaedah peta () membungkus urutan yang mendasari dalam instance Stream , sedangkan kaedah flatMap () memungkinkan untuk mengelakkan Stream
bersarang
Dalam contoh berikut, peta () menghasilkan Aliran yang terdiri daripada hasil penerapan kaedah toUpperCase () pada elemen aliran Input :
List myList = Stream.of("a", "b") .map(String::toUpperCase) .collect(Collectors.toList()); assertEquals(asList("A", "B"), myList);
peta () berfungsi dengan baik dalam kes sederhana, tetapi bagaimana jika kita mempunyai sesuatu yang lebih kompleks seperti senarai senarai sebagai input.
Mari lihat bagaimana ia berfungsi:
List
list = Arrays.asList( Arrays.asList("a"), Arrays.asList("b")); System.out.println(list);
Coretan ini mencetak senarai senarai [[a], [b]].
Sekarang, mari gunakan flatMap () :
System.out.println(list .stream() .flatMap(Collection::stream) .collect(Collectors.toList()));
Hasil coretan seperti itu akan diratakan menjadi [a, b].
T dia flatMap () Kaedah pertama mendatar input Stream of Streams kepada Stream daripada Strings (untuk lebih lanjut mengenai mendatar, lihat artikel). Selepas itu ia berfungsi sama dengan kaedah peta () .
4. Kesimpulan
Java 8 memberi kita peluang untuk menggunakan kaedah peta () dan flatMap () yang pada awalnya digunakan dalam bahasa fungsional.
Kami boleh memanggilnya di Aliran dan Pilihan. Kaedah ini membantu kita mendapatkan objek yang dipetakan dengan menerapkan fungsi pemetaan yang disediakan.
Seperti biasa, anda boleh melihat contoh yang diberikan dalam artikel ini di GitHub.