Saya telah melihat dalam banyak contoh bahwa kadang-kadang Seq sedang digunakan, sementara waktu lain adalah Daftar ...
Apakah ada perbedaan, selain yang pertama adalah tipe Scala dan Daftar yang berasal dari Jawa?
sumber
Saya telah melihat dalam banyak contoh bahwa kadang-kadang Seq sedang digunakan, sementara waktu lain adalah Daftar ...
Apakah ada perbedaan, selain yang pertama adalah tipe Scala dan Daftar yang berasal dari Jawa?
Dalam istilah Jawa, Scala adalah Seq
Java List
, dan Scala adalah List
Java LinkedList
.
Perhatikan bahwa itu Seq
adalah trait
, yang setara dengan Java interface
, tetapi dengan yang setara dengan metode bek yang akan datang. Scala's List
adalah kelas abstrak yang diperluas oleh Nil
dan ::
, yang merupakan implementasi konkret dari List
.
Jadi, di mana Java List
adalah interface
, Scala List
adalah implementasi.
Selain itu, Scala List
tidak dapat diubah, yang tidak terjadi pada LinkedList
. Kenyataannya, Java tidak memiliki yang setara dengan koleksi yang tidak dapat diubah (hanya baca saja yang menjamin objek baru tidak dapat diubah, tetapi Anda masih dapat mengubah yang lama, dan, oleh karena itu, yang "hanya baca").
Scala's List
sangat dioptimalkan oleh kompiler dan perpustakaan, dan ini adalah tipe data dasar dalam pemrograman fungsional. Namun, ia memiliki keterbatasan dan itu tidak memadai untuk pemrograman paralel. Hari-hari ini, Vector
adalah pilihan yang lebih baik daripada List
, tetapi kebiasaan sulit dihilangkan.
Seq
adalah generalisasi yang baik untuk urutan, jadi jika Anda memprogram ke antarmuka, Anda harus menggunakannya. Perhatikan bahwa sebenarnya ada tiga dari mereka: collection.Seq
, collection.mutable.Seq
dan collection.immutable.Seq
, dan itu adalah yang terakhir yang adalah "default" diimpor ke dalam ruang lingkup.
Ada juga GenSeq
dan ParSeq
. Metode yang terakhir berjalan secara paralel jika memungkinkan, sedangkan yang pertama adalah induk dari keduanya Seq
dan ParSeq
, menjadi generalisasi yang cocok ketika paralelisme kode tidak menjadi masalah. Keduanya relatif baru diperkenalkan, sehingga orang belum menggunakannya terlalu banyak.
String
bukan koleksi, ini adalah contoh dari kelas yang tidak dapat diubah yang akrab bagi programmer Java.UnsupportedOperationException
karena ini. Untuk membuat daftar abadi di Jawa Anda menggunakan Collections.unmodifiableList () dan juga ada metode lain untuk Set, Maps dll. Docs.oracle.com/javase/6/docs/api/java/util/…Sebuah Seq adalah Iterable yang memiliki urutan didefinisikan elemen. Urutan memberikan metode
apply()
untuk pengindeksan, mulai dari 0 hingga panjang urutan. Seq memiliki banyak subclass termasuk Queue, Range, List, Stack, dan LinkedList.Sebuah Daftar adalah Seq yang diimplementasikan sebagai linked list berubah. Ini paling baik digunakan dalam kasus-kasus dengan pola akses terakhir-masuk pertama-keluar (LIFO).
Berikut adalah hierarki kelas koleksi lengkap dari Scala FAQ :
sumber
Seq
adalah sifat yangList
mengimplementasikan.Jika Anda mendefinisikan wadah Anda sebagai
Seq
, Anda dapat menggunakan wadah apa pun yang menerapkanSeq
sifat.Catat itu
Hanya bantuan singkat untuk:
jika tipe kontainer tidak ditentukan, struktur data yang mendasarinya default ke
List
.sumber
Di Scala, Daftar mewarisi dari Seq, tetapi mengimplementasikan Produk ; di sini adalah definisi Daftar yang tepat :
[Catatan: yang sebenarnya definisi . Tad sedikit lebih kompleks, untuk fit dengan dan membuat penggunaan kerangka koleksi yang sangat kuat Scala]
sumber
Seperti yang dikatakan @ daniel-c-sobral, List memperluas sifat Seq dan merupakan kelas abstrak yang diterapkan oleh
scala.collection.immutable.$colon$colon
(atau::
singkatnya), tetapi secara teknis, pikiran bahwa sebagian besar daftar dan seq yang kami gunakan diinisialisasi dalam bentukSeq(1, 2, 3)
atauList(1, 2, 3)
yang keduanya kembaliscala.collection.immutable.$colon$colon
, maka seseorang dapat menulis:Sebagai hasilnya, saya berpendapat bahwa satu-satunya hal yang penting adalah metode yang ingin Anda ungkapkan, misalnya untuk menambahkan Anda dapat menggunakan
::
dari Daftar yang saya temukan berlebihan dengan+:
dari Seq dan saya pribadi tetap menggunakan Seq secara default.sumber