Perbedaan Antara map () dan flatMap ()

1. Ikhtisar

map () dan flatMap () API berasal dari bahasa fungsional. Di Java 8, Anda dapat menemukannya di Opsional, Aliran, dan di CompletableFuture (meskipun dengan nama yang sedikit berbeda).

Stream mewakili urutan objek, sedangkan opsional adalah kelas yang mewakili nilai yang bisa ada atau tidak ada. Di antara operasi agregat lainnya, kami memiliki metode map () dan flatMap () .

Terlepas dari kenyataan bahwa keduanya memiliki tipe pengembalian yang sama , keduanya sangat berbeda. Mari kita jelaskan perbedaan ini dengan menganalisis beberapa contoh aliran dan pilihan.

2. Map dan Flatmap di Opsional

Metode map () bekerja dengan baik dengan Opsional - jika fungsi mengembalikan tipe tepat yang kita butuhkan:

Optional s = Optional.of("test"); assertEquals(Optional.of("TEST"), s.map(String::toUpperCase));

Namun, dalam kasus yang lebih kompleks kita mungkin diberi fungsi yang mengembalikan Opsional juga. Dalam kasus seperti itu, penggunaan map () akan mengarah ke struktur bersarang, karena implementasi map () melakukan penggabungan tambahan secara internal.

Mari kita lihat contoh lain untuk lebih memahami situasi ini:

assertEquals(Optional.of(Optional.of("STRING")), Optional .of("string") .map(s -> Optional.of("STRING")));

Seperti yang bisa kita lihat, kita berakhir dengan struktur bersarang Opsional . Meskipun berfungsi, ini cukup rumit untuk digunakan dan tidak memberikan keamanan nol tambahan, jadi lebih baik untuk menjaga struktur tetap rata.

Itulah tepatnya yang flatMap () bantu kita lakukan:

assertEquals(Optional.of("STRING"), Optional .of("string") .flatMap(s -> Optional.of("STRING")));

3. Map dan Flatmap di Streams

Kedua metode bekerja dengan cara yang sama untuk Opsional .

Metode map () membungkus urutan yang mendasari dalam instance Stream , sedangkan metode flatMap () memungkinkan menghindari Stream bersarang struktur.

Dalam contoh berikut, map () menghasilkan Stream yang terdiri dari hasil penerapan metode toUpperCase () ke elemen input Stream:

List myList = Stream.of("a", "b") .map(String::toUpperCase) .collect(Collectors.toList()); assertEquals(asList("A", "B"), myList);

map () bekerja cukup baik dalam kasus sederhana, tetapi bagaimana jika kita memiliki sesuatu yang lebih kompleks seperti daftar daftar sebagai masukan.

Mari kita lihat cara kerjanya:

List
    
      list = Arrays.asList( Arrays.asList("a"), Arrays.asList("b")); System.out.println(list);
    

Potongan ini mencetak daftar daftar [[a], [b]].

Sekarang, mari gunakan flatMap () :

System.out.println(list .stream() .flatMap(Collection::stream) .collect(Collectors.toList()));

Hasil potongan tersebut akan diratakan menjadi [a, b].

T ia flatMap () metode pertama merata masukan Streaming dari Streaming untuk Streaming dari Strings (untuk lebih lanjut tentang merata, lihat artikel). Setelah itu bekerja mirip dengan metode map () .

4. Kesimpulan

Java 8 memberi kita kesempatan untuk menggunakan metode map () dan flatMap () yang awalnya digunakan dalam bahasa fungsional.

Kami dapat memanggilnya di Aliran dan Opsional. Metode ini membantu kita mendapatkan objek yang dipetakan dengan menerapkan fungsi pemetaan yang disediakan.

Seperti biasa, Anda dapat melihat contoh yang diberikan dalam artikel ini di GitHub.