Kotlin memiliki fungsi iterasi yang sangat bagus, like forEach
or repeat
, tetapi saya tidak dapat membuat operator break
and continue
bekerja dengannya (baik lokal maupun non-lokal):
repeat(5) {
break
}
(1..5).forEach {
continue@forEach
}
Tujuannya adalah untuk meniru loop biasa dengan sintaks fungsional sedekat mungkin. Itu pasti mungkin di beberapa versi lama Kotlin, tapi saya kesulitan untuk mereproduksi sintaksnya.
Masalahnya mungkin bug dengan label (M12), tetapi saya pikir contoh pertama harus berfungsi.
Sepertinya saya pernah membaca di suatu tempat tentang trik / anotasi khusus, tetapi saya tidak dapat menemukan referensi apa pun tentang subjek tersebut. Mungkin terlihat seperti berikut:
public inline fun repeat(times: Int, @loop body: (Int) -> Unit) {
for (index in 0..times - 1) {
body(index)
}
}
continue@label
danbreak@label
fitur), lihat pertanyaan terkait: stackoverflow.com/questions/34642868/…break
dancontinue
untuk loop fungsional, atau jika Anda mencari jawaban alternatif yang melakukan hal yang persis sama. Yang pertama tampaknya menjadi masalah, karena Anda menolak yang terakhir.Jawaban:
Edit :
Menurut dokumentasi Kotlin , dimungkinkan menggunakan anotasi.
Jawaban Asli :
Karena Anda memberikan a
(Int) -> Unit
, Anda tidak dapat memutuskannya, karena kompilator tidak tahu bahwa itu digunakan dalam satu loop.Anda memiliki beberapa pilihan:
Gunakan loop biasa:
Jika loop adalah kode terakhir dalam metode
yang dapat Anda gunakan
return
untuk keluar dari metode (ataureturn value
jika itu bukanunit
metode).Gunakan metode
Buat metode pengulangan kustom yang kembali
Boolean
untuk melanjutkan.sumber
break
dancontinue
hanya bekerja dalam loop.forEach
,repeat
dan semua metode lainnya hanya itu: metode dan bukan loop. Yoav mempresentasikan beberapa alternatif tetapibreak
dancontinue
tidak hanya bekerja untuk metode.continue@label
danbreak@label
fitur), lihat pertanyaan terkait: stackoverflow.com/questions/34642868/…Ini akan mencetak 1 sampai 5.
return@forEach
Bertindak seperti kata kuncicontinue
di Java, yang berarti dalam kasus ini, ia masih mengeksekusi setiap loop tetapi melompat ke iterasi berikutnya jika nilainya lebih besar dari 5.Ini akan mencetak 1 hingga 10 tetapi melompati 5.
Cobalah di Kotlin Playground .
sumber
continue
danbreak
contoh: pl.kotl.in/_LAvET-wXIstirahat dapat dicapai dengan menggunakan:
Dan kelanjutan dapat dicapai dengan:
Seperti yang direkomendasikan oleh siapa pun di sini ... baca dokumen: P https://kotlinlang.org/docs/reference/returns.html#return-at-labels
sumber
@loop
memberikan hasil yang diinginkan sama juga.Anda dapat menggunakan ekspresi return from lambda yang meniru a
continue
ataubreak
bergantung pada penggunaan Anda.Hal ini tercakup dalam pertanyaan terkait: Bagaimana cara melakukan "break" atau "continue" saat berada dalam loop fungsional dalam Kotlin?
sumber
Seperti yang dikatakan dalam dokumentasi Kotlin , menggunakan
return
adalah cara yang tepat. Hal yang baik tentang kotlin adalah jika Anda memiliki fungsi bertingkat, Anda dapat menggunakan label untuk secara eksplisit menulis dari mana asal pengembalian Anda:Pengembalian Lingkup Fungsi
dan Pengembalian Lokal (tidak berhenti melalui forEach = lanjutan)
Lihat dokumentasinya, bagus banget :)
sumber
forEach
continue
ketik perilaku dalamforEach
untuk
break
jenis perilaku yang harus Anda gunakanfor in until
ataufor in
sesuai daftar adalahNullable
atauNon-Nullable
Untuk daftar Nullable :
Untuk daftar Non-Nullable :
sumber
Pernyataan break untuk loop bersarang forEach ():
Hasil:
Lanjutkan pernyataan dengan fungsi anonim:
Hasil:
sumber
mungkin mengubah forEach menjadi
ini berfungsi untuk hashmaps
sumber