Jangan lupa bahwa lama tepercaya into
memungkinkan Anda mengambil apa pun yang seq
bisa (daftar, vektor, peta, set, sortir-peta) dan wadah kosong yang ingin Anda isi, dan letakkan into
.
(into [] '(1 2 3 4)) ==> [1 2 3 4] "have a lazy list and want a vector"
(into #{} [1 2 3 4]) ==> #{1 2 3 4} "have a vector and want a set"
(into {} #{[1 2] [3 4]}) ==> {3 4, 1 2} "have a set of vectors want a map"
(into #{} [{1 2} {3 4}]) ==> #{{1 2} {3 4}} "have a vector of maps want a set of maps"
into
adalah pembungkus conj
, yang merupakan abstraksi dasar untuk menyisipkan entri baru secara tepat ke dalam koleksi berdasarkan jenis koleksi. Prinsip yang membuat aliran ini begitu bagus adalah bahwa Clojure dibangun di atas abstraksi yang dapat disusun , dalam hal ini into
di atas conj
di atas koleksi dan seq
.
Contoh di atas akan tetap tersusun dengan baik jika penerima diteruskan pada waktu proses: karena abstraksi yang mendasarinya ( seq
dan conj
) diimplementasikan untuk semua koleksi (dan juga banyak koleksi Java), jadi abstraksi yang lebih tinggi tidak perlu khawatir tentang banyak kasus sudut khusus terkait data.
into
penggunaanconj
, melakukan(into '() some-seq)
akan menghasilkan daftar itulah terbalik beberapa-seq, karenaconj
conses ke daftar.into
menggunakan transien (untuk sebagian besar jenis seq) untuk karakteristik kinerja yang lebih baik daripada kebanyakan cara konversi lainnya.vec
,set
dan biasanyainto
teman Anda akan dengan mudah "mengonversi" ke jenis koleksi lain.Bagaimana Anda ingin mengubah vektor peta menjadi peta peta? Anda memerlukan kunci, dapatkah Anda memberikan contoh masukan / keluaran yang diharapkan?
sumber
Untuk vektor ada
vec
fungsinyauser=> (vec '(1 2 3)) [1 2 3]
Untuk urutan malas ada
lazy-seq
fungsinyauser=> (lazy-seq [1 2 3]) (1 2 3)
Untuk mengubahnya menjadi himpunan, ada
set
fungsinyauser=> (set [{:a :b, :c :d} {:a :b} {:a :b}]) #{{:a :b} {:a :b, :c :d}}
sumber
lazy-seq
alih-alihseq
hanya menambahkan tipuan yang tidak berguna. Jika benar-benar Anda ingin mengembalikan sesuatu yang tidak nihil bahkan sebelum koleksi kosong itu adasequence
.lazy-seq
merupakan konstruksi tingkat rendah.Satu lagi jawaban untuk mengubah dari daftar menjadi peta (demi kelengkapan) - dari sini :
(apply hash-map '(1 2 3 4)) ;=>{1 2, 3 4}
sumber
Untuk mengonversi vektor menjadi daftar, Anda juga dapat menggunakan
for
, seperti ini:=> (for [i [1 2 3 4]] i) (1 2 3 4)
Jika Anda tidak ingin memanipulasi data, gunakan saja
seq
pada vektor:=> (seq [1 2 3]) (1 2 3)
sumber
for
Anda bisa melakukannya(map identity [1 2 3 4])
Vektor tidak perlu diubah menjadi daftar. Clojure akan memperlakukan vektor sebagaimana ia akan memperlakukan daftar - sebagai urutan - bila urutan diperlukan. Sebagai contoh,
user=> (cons 0 [1 2 3]) (0 1 2 3)
Jika Anda perlu memastikan bahwa vektor diperlakukan sebagai urutan, bungkus dalam
seq
:user=> (conj [1 2 3] 0) ; treated as a vector [1 2 3 0] user=> (conj (seq [1 2 3]) 0) ; treated as a sequence (0 1 2 3)
Jika Anda memiliki vektor peta, dan Anda menginginkan satu set peta, tidak masalah bahwa vektor tersebut menyimpan peta. Anda cukup mengonversi vektor menjadi satu set seperti biasa:
user=> (set [{:a 1, :b 2} {"three" 3, "four" 4}]) #{{:a 1, :b 2} {"four" 4, "three" 3}}
sumber