Di Jawa kita bisa melakukan hal berikut
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Tetapi jika kita menulis ulang ke Kotlin secara langsung seperti di bawah ini
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
Saya mendapatkan kesalahan karena tidak menemukan add
dan remove
berfungsi dari Daftar saya
Saya bekerja di sekitar casting ke ArrayList, tapi itu aneh perlu melemparkannya, sementara di Jawa casting tidak diperlukan. Dan itu mengalahkan tujuan memiliki Daftar kelas abstrak
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Apakah ada cara bagi saya untuk menggunakan Daftar tetapi tidak perlu melemparkannya, seperti apa yang bisa dilakukan di Jawa?
collections
kotlin
Elye
sumber
sumber
myList = null
dan kemudian panggilan tambahkan tanpa!!
. Anda dapat mengatasinya dengan menggunakanlateinit
kata kunci di depan properti Anda sepertilateinit var myList: List<Int>
ini : dengan cara ini Anda tidak perlu segera menginisialisasi daftar, tetapi Anda menjamin kepada kompiler bahwa Anda akan menginisialisasinya sebelum menggunakan daftar tersebut pertama kali. Ini adalah solusi yang lebih halus, tetapi ini menempatkan Anda sebagai pengembang.Jawaban:
https://kotlinlang.org/docs/reference/collections.html
Anda harus menggunakan
MutableList
daftar.MutableList<Int> = arrayListOf()
juga harus bekerja.sumber
Menentukan koleksi Daftar di Kotlin dengan cara yang berbeda:
Variabel tidak dapat diubah dengan daftar tidak berubah (hanya baca):
Variabel tidak dapat diubah dengan daftar dapat diubah:
atau tanpa nilai awal - daftar kosong dan tanpa tipe variabel eksplisit:
users.add(anohterUser)
atauusers += anotherUser
(di bawah tenda ituusers.add(anohterUser)
)Variabel yang dapat diubah dengan daftar tidak berubah:
atau tanpa nilai awal - daftar kosong dan tanpa tipe variabel eksplisit:
users += anotherUser
- * ia membuat ArrayList baru dan menetapkannya untukusers
Variabel yang dapat diubah dengan daftar yang dapat diubah:
atau tanpa nilai awal - daftar kosong dan tanpa tipe variabel eksplisit:
users.add(anohterUser)
users += anotherUser
lihat juga: https://kotlinlang.org/docs/reference/collections.html
sumber
Setuju dengan semua jawaban di atas untuk menggunakan MutableList tetapi Anda juga dapat menambah / menghapus dari Daftar dan mendapatkan daftar baru seperti di bawah ini.
Atau
sumber
Rupanya, Daftar default Kotlin tidak berubah. Untuk memiliki Daftar yang bisa berubah, orang harus menggunakan MutableList seperti di bawah ini
Diperbarui Meskipun demikian, tidak disarankan untuk menggunakan MutableList kecuali untuk daftar yang benar-benar ingin Anda ubah. Mengacu pada https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 untuk bagaimana koleksi Read-only menyediakan pengkodean yang lebih baik.
sumber
MutableList
, namun menginisialisasi dengan itunull
tidak akan berhasil. Hanya panggilan yang dinyatakan aman atau tidak nol yang diizinkan pada jenis penerima yang dapat dibatalkanMutableList<Int>
.doSomething
lateinit
alih-alih membuat daftar nullable adalah cara yang tepat untuk menyelesaikan masalah ini. Tidak ingat apakahlateinit
sudah ditambahkan dari awal Kotlin, tapi ini jelas merupakan solusi saat ini untuk menggunakannya :-)Di Kotlin Anda harus menggunakan
MutableList
atauArrayList
.sumber
Anda dapat melakukannya dengan membuat yang baru seperti ini.
Sekarang Anda dapat menggunakan list2, Terima kasih.
sumber
https://kotlinlang.org/docs/reference/collections.html
Menurut tautan di atas Daftar <E> tidak dapat diubah di Kotlin. Namun ini akan berhasil:
sumber
list2
dapat diubah, lihat stackoverflow.com/questions/43114367/… .Membatasi Mutabilitas terhadap Pembangun
Jawaban teratas di sini dengan benar berbicara tentang perbedaan di Kotlin antara hanya-baca
List
(CATATAN: ini hanya-baca, bukan "tidak berubah" ), danMutableList
.Secara umum, seseorang harus berusaha untuk menggunakan daftar read-only, namun, kemampuan berubah-ubah masih sering berguna pada waktu konstruksi , terutama ketika berhadapan dengan perpustakaan pihak ketiga dengan antarmuka non-fungsional. Untuk kasus-kasus di mana teknik konstruksi alternatif tidak tersedia, seperti menggunakan
listOf
secara langsung, atau menerapkan konstruksi fungsional sepertifold
ataureduce
, konstruksi "fungsi pembangun" sederhana seperti berikut ini dengan baik menghasilkan daftar read-only dari yang dapat diubah sementara:dan ini dapat dengan baik dienkapsulasi menjadi fungsi utilitas inline yang dapat digunakan kembali:
yang bisa disebut seperti ini:
Sekarang, semua mutabilitas terisolasi ke satu ruang lingkup blok yang digunakan untuk pembangunan daftar read-only, dan sisa kode Anda menggunakan daftar read-only yang merupakan output dari pembangun.
UPDATE : Pada Kotlin 1.3.70,
buildList
fungsi tepat di atas tersedia di perpustakaan standar sebagai fungsi eksperimental, bersama dengan analogbuildSet
danbuildMap
. Lihat https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .sumber
Dalam konsep data abadi, mungkin ini cara yang lebih baik:
sumber
A
list
adalahimmutable
denganDefault
, Anda bisa menggunakannyaArrayList
. seperti ini :maka Anda dapat
add/delete
item dari ini seperti di bawah ini:sumber