Saya membutuhkan fungsi peta . Apakah sudah ada yang seperti ini di Jawa?
(Bagi mereka yang bertanya-tanya: Saya tentu saja tahu sendiri bagaimana mengimplementasikan fungsi sepele ini ...)
java
map-function
Albert
sumber
sumber
Jawaban:
Tidak ada gagasan tentang fungsi di JDK pada java 6.
Jambu memiliki antarmuka fungsi dan metode menyediakan fungsionalitas yang Anda butuhkan.
Collections2.transform(Collection<E>, Function<E,E2>)
Contoh:
Keluaran:
Saat ini, dengan Java 8, sebenarnya ada fungsi peta, jadi saya mungkin akan menulis kode dengan cara yang lebih ringkas:
sumber
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Sejak Java 8, ada beberapa opsi standar untuk melakukan ini di JDK:
Lihat
java.util.Collection.stream()
danjava.util.stream.Collectors.toList()
.sumber
toList()
. Mengganti ke jenis yang berbeda:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
diganti dengan adildoMap
?foo::doMap
atauFoo::doMap
.Ada perpustakaan indah yang disebut Java Fungsional yang menangani banyak hal yang Anda ingin memiliki Jawa tetapi tidak. Kemudian lagi, ada juga bahasa Scala yang luar biasa ini yang melakukan semua yang seharusnya dilakukan oleh Java tetapi tetap kompatibel dengan apa pun yang ditulis untuk JVM.
sumber
a.map({int i => i + 42});
apakah mereka memperpanjang compiler? atau menambahkan preprosesor?Berhati-hatilah dengan
Collections2.transform()
dari jambu biji. Keuntungan terbesar metode itu juga bahaya terbesarnya: kemalasannya.Lihatlah dokumentasi
Lists.transform()
, yang saya percaya berlaku juga untukCollections2.transform()
:Juga dalam dokumentasi
Collections2.transform()
mereka menyebutkan Anda mendapatkan tampilan langsung, bahwa perubahan dalam daftar sumber mempengaruhi daftar yang diubah. Perilaku semacam ini dapat menyebabkan masalah yang sulit dilacak jika pengembang tidak menyadari cara kerjanya.Jika Anda menginginkan "peta" yang lebih klasik, yang akan berjalan sekali dan sekali saja, maka Anda lebih baik
FluentIterable
, juga dari Guava, yang memiliki operasi yang jauh lebih sederhana. Ini adalah contoh google untuk itu:transform()
di sini adalah metode peta. Ini menggunakan Fungsi yang sama <> "callbacks" sepertiCollections.transform()
. Daftar yang Anda dapatkan hanya baca-saja, gunakancopyInto()
untuk mendapatkan daftar baca-tulis.Kalau tidak tentu saja ketika java8 keluar dengan lambdas, ini akan usang.
sumber
Ini adalah fungsi fungsional lain yang dengannya Anda dapat menggunakan peta: http://code.google.com/p/totallylazy/
sumber
Meskipun ini adalah pertanyaan lama, saya ingin menunjukkan solusi lain:
Cukup tentukan operasi Anda sendiri menggunakan java generics dan java 8 stream:
Daripada Anda dapat menulis kode seperti ini:
sumber