- Keyword dan Map
- Collection of collection
:pertama
:terakhirKeyword adalah tipe data yang paling dasar dan paling aneh, karena tidak ada padanannya di dunia nyata seperti number, string, dan boolean. Anda bisa membayangkan keyword sebagai sebuah tipe string khusus, yang digunakan sebagai label. Keyword sering digunakan di dalam map.
Map menampung satu set key dan value (nilai) yang saling berasosiasi. Anda bisa membayangkannya seperti membaca kamus: Anda mencari sebuah kata (keyword) dan melihat artinya (value). Jika Anda pernah melakukan pemrograman dengan bahasa lain, mungkin Anda pernah melihat sesuatu seperti map, mungkin namanya dictionaries, hash, atau associative array.
Kita menulis map dengan menutup key dan value menggunakan kurung kurawal { }, seperti:
{:firstname "Pete" :lastname "Green"}
{:a 1 :b "pete"}
{}Map berguna karena dapat menampung data secara normal seperti yang kita pikirkan. Kita ambil contoh, Pete Green. Map dapat menampung nama depan, nama belakang, alamat, makanan favorit, atau apa pun. Menggunakan map adalah salah satu cara termudah untuh mengumpulkan dan membaca data. Contoh di baris terakhir adalah map kosong. Sebuah map yang sudah siap menampung data, tapi belum ada apa-apa di dalamnya.
Mari kita melihat beberapa fungsi yang bisa kita gunakan bersama map. Kita tidak punya fungsi sebanyak vector dan list.
(map? {:firstname "Pete" :lastname "Green})
;=> true
(get {:firstname "Pete" :lastname "Green"} :lastname)
;=> "Green"
(get {:firstname "Pete" :lastname "Green"} :address :MISS)
;=> :MISSmap? menentukan apakah argumen yang dikirimkan adalah sebuah map. Nilai baliknya adalah true atau false.
get bekerja seperti nth pada vector, tapi yang diambil adalah key, bukan number. get menggunakan key yang disuplai sebagai argumennya untuk mencari value di dalam map. Apa yang terjadi pada contoh get yang terakhir? Kita bisa menyuplai value untuk dikembalikan oleh get jika tidak bisa menemukan key yang kita maksud, dalam hal ini get tidak bisa menemukan :address dari dalam map sehingga mengembalikan value yang sudah kita berikan sebelumnya, yaitu :MISS.
(assoc {:firstname "Asep"} :address "Jakarta")
;=> {:firstname "Asep :address "Jakarta"}
(dissoc {:firstname "Asep" :address "Jakarta"} :address)
;=> {:firstname "Asep"}
(merge {:firstname "Asep"} {:address "Jakarta"})
;=> {:firstname "Asep" :address "Jakarta"}assoc dan dissoc adalah sepasang fungsi yang gunanya untuk mengasosiasikan dan memisahkan sebuah key dan value pada sebuah map. Lihat bagaimana kita menambahkan "Jakarta" ke dalam sebuah map menggunakan assoc kemudian mengeluarkannya lagi dari map tersebut dengan menggunakan dissoc.
merge menyatukan 2 buah map yang berbeda menjadi satu map baru.
(count {:firstname "Asep" :lastname "Bagja"})
;=> 2count, setiap collection memiliki fungsi ini. count mengembalikan jumlah asosiasi di dalam sebuah map.
(keys {:firstname "Asep" :lastname "Bagja"})
;=> (:firstname :lastname)
(vals {:firstname "Asep" :lastname "Bagja"})
;=> ("Asep" "Bagja")Lalu kita punya keys dan vals, yang fungsinya sangat sederhana: mengembalikan keys dan value dalam map. Urutannya tidak bisa dijamin, kita bisa saja mendapat (:firstname :lastname) atau (:lastname :firstname).
Mari kita lihat satu lagi tentang map sebelum melanjutkan ke materi selanjutnya. Anda bisa menggunakan get untuk mendapat value dari map, tapi Anda akan sering melihat sesuatu seperti ini:
(:firstname {:firstname "Asep" :city "Jakarta Selatan"})
;=> "Asep"
(:city {:firstname "Asep" :city "Jakarta Selatan"})
;=> "Jakarta Selatan"
(:lastname {:firstname "Asep" :city "Jakarta Selatan"} :MISS)
;=> :MISSAnda bisa menggunakan keyword dengan cara yang sama seperti menggunakan fungsi untuk mencari value dari dalam map. Silahkan Anda pilih antara menggunakan get atau keyword di dalam kode Anda sendiri.
Tipe data sederhana seperti number, keyword, dan string bukan satu-satunya tipe data yang bisa dimasukkan ke dalam collection. Anda juga bisa memasukkan collection ke dalam collection baru, sehingga Anda bisa memiliki vector di dalam map, atau sekumpulan map, atau kombinasi data apa pun yang sesuai dengan kebutuhan Anda.
Vector yang berisi map
(def teman [{:name "Asep"} {:name "Didit"}])
(last teman)
;=> {:name "Didit"}Map yang berisi map
(def keluarga {:sepupu {:nama "Budi" :kota "Jakarta Selatan"}
:kakak {:nama "Deni" :kota "Yogyakarta"}
:adik {:nama "Tina" :kota "Bandung"}})
(get keluarga :adik)
;=> {:nama "Tina" :kota "Bandung"}
(:kakak keluarga)
;=> {:nama "Deni" :kota "Yogyakarta"}
(:kota (:sepupu keluarga))
;=> "Jakarta Selatan"