Saya ingin beberapa seno untuk ini:
Map rowToMap(row) {
def rowMap = [:];
row.columns.each{ rowMap[it.name] = it.val }
return rowMap;
}
mengingat hal-hal GDK, saya berharap dapat melakukan sesuatu seperti:
Map rowToMap(row) {
row.columns.collectMap{ [it.name,it.val] }
}
tapi saya belum melihat apa pun di dokumen ... apakah saya melewatkan sesuatu? atau apakah saya terlalu malas?
Jawaban:
Baru-baru ini saya menemukan kebutuhan untuk melakukan hal itu: mengubah daftar menjadi peta. Pertanyaan ini diposting sebelum Groovy versi 1.7.9 keluar, jadi metodenya
collectEntries
belum ada. Ini bekerja persis seperticollectMap
metode yang diusulkan :Jika karena alasan tertentu Anda terjebak dengan versi Groovy yang lebih lama,
inject
metode ini juga dapat digunakan (seperti yang diusulkan di sini ). Ini adalah versi yang sedikit dimodifikasi yang hanya membutuhkan satu ekspresi di dalam closure (hanya untuk menyimpan karakter!):The
+
Operator juga dapat digunakan sebagai pengganti<<
.sumber
Lihat "suntik". Pemrograman fungsional nyata menyebutnya "lipat".
Dan, saat Anda melakukannya, Anda mungkin ingin mendefinisikan metode sebagai Kategori, bukan langsung di metaClass. Dengan begitu, Anda dapat menentukannya sekali untuk semua Koleksi:
Contoh penggunaan:
sumber
Apakah metode groupBy tidak tersedia saat pertanyaan ini diajukan?
sumber
Map<K, List<V>>
Tampaknya OP sedang mencari metode dengan tipe kembalianMap<K, V>
, jadi groupBy tidak berfungsi dalam kasus ini.Jika yang Anda butuhkan adalah key-value pair sederhana, maka metode ini
collectEntries
sudah cukup. Sebagai contohTetapi jika Anda menginginkan struktur yang mirip dengan Multimap, di mana ada beberapa nilai per kunci, maka Anda ingin menggunakan
groupBy
metode ini.sumber
Selain itu, jika Anda menggunakan koleksi google ( http://code.google.com/p/google-collections/ ), Anda dapat melakukan sesuatu seperti ini:
sumber
ok ... Saya telah bermain dengan ini sedikit lagi dan saya pikir ini adalah metode yang cukup keren ...
sekarang setiap subkelas Peta atau Koleksi memiliki metode ini ...
di sini saya menggunakannya untuk membalikkan kunci / nilai dalam Peta
dan di sini saya menggunakannya untuk membuat peta dari daftar
sekarang saya hanya memasukkan ini ke dalam kelas yang dipanggil saat aplikasi saya dimulai dan metode ini tersedia di seluruh kode saya.
EDIT:
untuk menambahkan metode ke semua larik ...
sumber
Saya tidak dapat menemukan apa pun yang ada di dalamnya ... tetapi menggunakan ExpandoMetaClass saya dapat melakukan ini:
ini menambahkan metode collectMap ke semua ArrayLists ... Saya tidak yakin mengapa menambahkannya ke Daftar atau Koleksi tidak berhasil .. Saya rasa itu untuk pertanyaan lain ... tapi sekarang saya bisa melakukan ini ...
dari Daftar ke Peta yang dihitung dengan satu penutupan ... persis seperti yang saya cari.
Sunting: alasan saya tidak dapat menambahkan metode ke Daftar dan Koleksi antarmuka adalah karena saya tidak melakukan ini:
setelah pemanggilan metode itu, Anda dapat menambahkan metode ke antarmuka .. yang dalam hal ini berarti metode collectMap saya akan bekerja pada rentang seperti ini:
yang menghasilkan peta: [0: 0, 1: 2, 2: 4]
sumber
Bagaimana dengan sesuatu yang seperti ini?
sumber