Perbezaan Antara peta () dan peta rata ()

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 . Walaupun berfungsi, ia agak sukar untuk digunakan dan tidak memberikan keselamatan tambahan, jadi lebih baik menjaga struktur yang rata.

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 struktur.

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.